LyoNCiAgICBGcmVlUlRPUyBWOC4wLjEgLSBDb3B5cmlnaHQgKEMpIDIwMTQgUmVhbCBUaW1lIEVuZ2luZWVycyBMdGQuIA0KICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQNCg0KICAgIFZJU0lUIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnIFRPIEVOU1VSRSBZT1UgQVJFIFVTSU5HIFRIRSBMQVRFU1QgVkVSU0lPTi4NCg0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgICogICAgRnJlZVJUT1MgcHJvdmlkZXMgY29tcGxldGVseSBmcmVlIHlldCBwcm9mZXNzaW9uYWxseSBkZXZlbG9wZWQsICAgICoNCiAgICAgKiAgICByb2J1c3QsIHN0cmljdGx5IHF1YWxpdHkgY29udHJvbGxlZCwgc3VwcG9ydGVkLCBhbmQgY3Jvc3MgICAgICAgICAgKg0KICAgICAqICAgIHBsYXRmb3JtIHNvZnR3YXJlIHRoYXQgaGFzIGJlY29tZSBhIGRlIGZhY3RvIHN0YW5kYXJkLiAgICAgICAgICAgICAqDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICBIZWxwIHlvdXJzZWxmIGdldCBzdGFydGVkIHF1aWNrbHkgYW5kIHN1cHBvcnQgdGhlIEZyZWVSVE9TICAgICAgICAgKg0KICAgICAqICAgIHByb2plY3QgYnkgcHVyY2hhc2luZyBhIEZyZWVSVE9TIHR1dG9yaWFsIGJvb2ssIHJlZmVyZW5jZSAgICAgICAgICAqDQogICAgICogICAgbWFudWFsLCBvciBib3RoIGZyb206IGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnL0RvY3VtZW50YXRpb24gICAgICAgICoNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICAgICAqICAgIFRoYW5rIHlvdSEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCg0KICAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlUlRPUyBkaXN0cmlidXRpb24uDQoNCiAgICBGcmVlUlRPUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyDQogICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAodmVyc2lvbiAyKSBhcyBwdWJsaXNoZWQgYnkgdGhlDQogICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uID4+IUFORCBNT0RJRklFRCBCWSE8PCB0aGUgRnJlZVJUT1MgZXhjZXB0aW9uLg0KDQogICAgPj4hICAgTk9URTogVGhlIG1vZGlmaWNhdGlvbiB0byB0aGUgR1BMIGlzIGluY2x1ZGVkIHRvIGFsbG93IHlvdSB0byAgICAgITw8DQogICAgPj4hICAgZGlzdHJpYnV0ZSBhIGNvbWJpbmVkIHdvcmsgdGhhdCBpbmNsdWRlcyBGcmVlUlRPUyB3aXRob3V0IGJlaW5nICAgITw8DQogICAgPj4hICAgb2JsaWdlZCB0byBwcm92aWRlIHRoZSBzb3VyY2UgY29kZSBmb3IgcHJvcHJpZXRhcnkgY29tcG9uZW50cyAgICAgITw8DQogICAgPj4hICAgb3V0c2lkZSBvZiB0aGUgRnJlZVJUT1Mga2VybmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgITw8DQoNCiAgICBGcmVlUlRPUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkNCiAgICBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTDQogICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgRnVsbCBsaWNlbnNlIHRleHQgaXMgYXZhaWxhYmxlIGZyb20gdGhlIGZvbGxvd2luZw0KICAgIGxpbms6IGh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL2EwMDExNC5odG1sDQoNCiAgICAxIHRhYiA9PSA0IHNwYWNlcyENCg0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgICogICAgSGF2aW5nIGEgcHJvYmxlbT8gIFN0YXJ0IGJ5IHJlYWRpbmcgdGhlIEZBUSAiTXkgYXBwbGljYXRpb24gZG9lcyAgICoNCiAgICAgKiAgICBub3QgcnVuLCB3aGF0IGNvdWxkIGJlIHdyb25nPyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgICogICAgaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcvRkFRSGVscC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KDQogICAgaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcgLSBEb2N1bWVudGF0aW9uLCBib29rcywgdHJhaW5pbmcsIGxhdGVzdCB2ZXJzaW9ucywNCiAgICBsaWNlbnNlIGFuZCBSZWFsIFRpbWUgRW5naW5lZXJzIEx0ZC4gY29udGFjdCBkZXRhaWxzLg0KDQogICAgaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcvcGx1cyAtIEEgc2VsZWN0aW9uIG9mIEZyZWVSVE9TIGVjb3N5c3RlbSBwcm9kdWN0cywNCiAgICBpbmNsdWRpbmcgRnJlZVJUT1MrVHJhY2UgLSBhbiBpbmRpc3BlbnNhYmxlIHByb2R1Y3Rpdml0eSB0b29sLCBhIERPUw0KICAgIGNvbXBhdGlibGUgRkFUIGZpbGUgc3lzdGVtLCBhbmQgb3VyIHRpbnkgdGhyZWFkIGF3YXJlIFVEUC9JUCBzdGFjay4NCg0KICAgIGh0dHA6Ly93d3cuT3BlblJUT1MuY29tIC0gUmVhbCBUaW1lIEVuZ2luZWVycyBsdGQgbGljZW5zZSBGcmVlUlRPUyB0byBIaWdoDQogICAgSW50ZWdyaXR5IFN5c3RlbXMgdG8gc2VsbCB1bmRlciB0aGUgT3BlblJUT1MgYnJhbmQuICBMb3cgY29zdCBPcGVuUlRPUw0KICAgIGxpY2Vuc2VzIG9mZmVyIHRpY2tldGVkIHN1cHBvcnQsIGluZGVtbmlmaWNhdGlvbiBhbmQgbWlkZGxld2FyZS4NCg0KICAgIGh0dHA6Ly93d3cuU2FmZVJUT1MuY29tIC0gSGlnaCBJbnRlZ3JpdHkgU3lzdGVtcyBhbHNvIHByb3ZpZGUgYSBzYWZldHkNCiAgICBlbmdpbmVlcmVkIGFuZCBpbmRlcGVuZGVudGx5IFNJTDMgY2VydGlmaWVkIHZlcnNpb24gZm9yIHVzZSBpbiBzYWZldHkgYW5kDQogICAgbWlzc2lvbiBjcml0aWNhbCBhcHBsaWNhdGlvbnMgdGhhdCByZXF1aXJlIHByb3ZhYmxlIGRlcGVuZGFiaWxpdHkuDQoNCiAgICAxIHRhYiA9PSA0IHNwYWNlcyENCiovDQoNCi8qDQogKiBCYXNpYyBpbnRlcnJ1cHQgZHJpdmVuIGRyaXZlciBmb3IgdGhlIEVNQUMgcGVyaXBoZXJhbC4gIFRoaXMgZHJpdmVyIGlzIG5vdA0KICogcmVlbnRyYW50IGFzIHdpdGggdUlQIHRoZSBidWZmZXJzIGFyZSBvbmx5IGV2ZXIgYWNjZXNzZWQgZnJvbSBhIHNpbmdsZSB0YXNrLg0KICoNCiAqIFRoZSBzaW1wbGUgYnVmZmVyIG1hbmFnZW1lbnQgdXNlZCB3aXRoaW4gdUlQIGFsbG93cyB0aGUgRU1BQyBkcml2ZXIgdG8gYWxzbw0KICogYmUgc2ltcGxpc3RpYy4gIFRoZSBkcml2ZXIgY29udGFpbmVkIHdpdGhpbiB0aGUgbHdJUCBkZW1vIGlzIG1vcmUNCiAqIGNvbXByZWhlbnNpdmUuDQogKi8NCg0KDQovKg0KQ2hhbmdlcyBmcm9tIFYzLjIuMg0KDQoJKyBDb3JyZWN0ZWQgdGhlIGJ5dGUgb3JkZXIgd2hlbiB3cml0aW5nIHRoZSBNQUMgYWRkcmVzcyB0byB0aGUgTUFDLg0KCSsgU3VwcG9ydCBhZGRlZCBmb3IgTUlJIGludGVyZmFjZXMuICBQcmV2aW91c2x5IG9ubHkgUk1JSSB3YXMgc3VwcG9ydGVkLg0KDQpDaGFuZ2VzIGZyb20gVjMuMi4zDQoNCgkrIFRoZSBNSUkgaW50ZXJmYWNlIGlzIG5vdyB0aGUgZGVmYXVsdC4NCgkrIE1vZGlmaWVkIHRoZSBpbml0aWFsaXNhdGlvbiBzZXF1ZW5jZSBzbGlnaHRseSB0byBhbGxvdyBhdXRvIGluaXQgbW9yZQ0KCSAgdGltZSB0byBjb21wbGV0ZS4NCg0KQ2hhbmdlcyBmcm9tIFYzLjIuNA0KDQoJKyBBbHNvIHJlYWQgdGhlIEVNQUNfUlNSIHJlZ2lzdGVyIGluIHRoZSBFTUFDIElTUiBhcyBhIHdvcmsgYXJvdW5kIHRoZSANCgkgIHRoZSBFTUFDIGJ1ZyB0aGF0IGNhbiByZXNldCB0aGUgUlggYml0IGluIEVNQUNfSVNSIHJlZ2lzdGVyIGJlZm9yZSB0aGUNCgkgIGJpdCBoYXMgYmVlbiByZWFkLg0KDQpDaGFuZ2VzIGZyb20gVjQuMC40DQoNCgkrIENvcnJlY3RlZCB0aGUgUnggZnJhbWUgbGVuZ3RoIG1hc2sgd2hlbiBvYnRhaW5pbmcgdGhlIGxlbmd0aCBmcm9tIHRoZQ0KCSAgcnggZGVzY3JpcHRvci4NCg0KKi8NCg0KLyogU3RhbmRhcmQgaW5jbHVkZXMuICovDQojaW5jbHVkZSA8c3RyaW5nLmg+DQoNCi8qIFNjaGVkdWxlciBpbmNsdWRlcy4gKi8NCiNpbmNsdWRlICJGcmVlUlRPUy5oIg0KI2luY2x1ZGUgInNlbXBoci5oIg0KI2luY2x1ZGUgInRhc2suaCINCg0KLyogdUlQIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgInVpcC5oIg0KDQovKiBIYXJkd2FyZSBzcGVjaWZpYyBpbmNsdWRlcy4gKi8NCiNpbmNsdWRlICJFbWFjLmgiDQojaW5jbHVkZSAibWlpLmgiDQoNCg0KLyogVVNFX1JNSUlfSU5URVJGQUNFIG11c3QgYmUgZGVmaW5lZCBhcyAxIHRvIHVzZSBhbiBSTUlJIGludGVyZmFjZSwgb3IgMA0KdG8gdXNlIGFuIE1JSSBpbnRlcmZhY2UuICovDQojZGVmaW5lIFVTRV9STUlJX0lOVEVSRkFDRSAwDQoNCi8qIFRoZSBidWZmZXIgYWRkcmVzc2VzIHdyaXR0ZW4gaW50byB0aGUgZGVzY3JpcHRvcnMgbXVzdCBiZSBhbGlnbmVkIHNvIHRoZQ0KbGFzdCBmZXcgYml0cyBhcmUgemVyby4gIFRoZXNlIGJpdHMgaGF2ZSBzcGVjaWFsIG1lYW5pbmcgZm9yIHRoZSBFTUFDDQpwZXJpcGhlcmFsIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBhZGRyZXNzLiAqLw0KI2RlZmluZSBlbWFjQUREUkVTU19NQVNLCQkJKCAoIHVuc2lnbmVkIGxvbmcgKSAweEZGRkZGRkZDICkNCg0KLyogQml0IHVzZWQgd2l0aGluIHRoZSBhZGRyZXNzIHN0b3JlZCBpbiB0aGUgZGVzY3JpcHRvciB0byBtYXJrIHRoZSBsYXN0DQpkZXNjcmlwdG9yIGluIHRoZSBhcnJheS4gKi8NCiNkZWZpbmUgZW1hY1JYX1dSQVBfQklUCQkJCSggKCB1bnNpZ25lZCBsb25nICkgMHgwMiApDQoNCi8qIEJpdCB1c2VkIHdpdGhpbiB0aGUgVHggZGVzY3JpcHRvciBzdGF0dXMgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUNCmRlc2NyaXB0b3IgaXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIEVNQUMgb3IgdGhlIHNvZnR3YXJlLiAqLw0KI2RlZmluZSBlbWFjVFhfQlVGX1VTRUQJCQkJKCAoIHVuc2lnbmVkIGxvbmcgKSAweDgwMDAwMDAwICkNCg0KLyogQSBzaG9ydCBkZWxheSBpcyB1c2VkIHRvIHdhaXQgZm9yIGEgYnVmZmVyIHRvIGJlY29tZSBhdmFpbGFibGUsIHNob3VsZA0Kb25lIG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgd2hlbiB0cnlpbmcgdG8gdHJhbnNtaXQgYSBmcmFtZS4gKi8NCiNkZWZpbmUgZW1hY0JVRkZFUl9XQUlUX0RFTEFZCQkoIDIgKQ0KI2RlZmluZSBlbWFjTUFYX1dBSVRfQ1lDTEVTCQkJKCBjb25maWdUSUNLX1JBVEVfSFogLyA0MCApDQoNCi8qIE1pc2MgZGVmaW5lcy4gKi8NCiNkZWZpbmUgZW1hY0lOVEVSUlVQVF9MRVZFTAkJCSggNSApDQojZGVmaW5lIGVtYWNOT19ERUxBWQkJCQkoIDAgKQ0KI2RlZmluZSBlbWFjVE9UQUxfRlJBTUVfSEVBREVSX1NJWkUJKCA1NCApDQojZGVmaW5lIGVtYWNQSFlfSU5JVF9ERUxBWQkJCSggNTAwMCAvIHBvcnRUSUNLX1BFUklPRF9NUyApDQojZGVmaW5lIGVtYWNSRVNFVF9LRVkJCQkJKCAoIHVuc2lnbmVkIGxvbmcgKSAweEE1MDAwMDAwICkNCiNkZWZpbmUgZW1hY1JFU0VUX0xFTkdUSAkJCSggKCB1bnNpZ25lZCBsb25nICkgKCAweDAxIDw8IDggKSApDQoNCi8qIFRoZSBBdG1lbCBoZWFkZXIgZmlsZSBvbmx5IGRlZmluZXMgdGhlIFRYIGZyYW1lIGxlbmd0aCBtYXNrLiAqLw0KI2RlZmluZSBlbWFjUlhfTEVOR1RIX0ZSQU1FCQkJKCAweGZmZiApDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKg0KICogUHJvdG90eXBlIGZvciB0aGUgRU1BQyBpbnRlcnJ1cHQgYXNtIHdyYXBwZXIuDQogKi8NCmV4dGVybiB2b2lkIHZFTUFDSVNSRW50cnkoIHZvaWQgKTsNCg0KLyoNCiAqIFByb3RvdHlwZSBmb3IgdGhlIEVNQUMgaW50ZXJydXB0IGZ1bmN0aW9uIC0gY2FsbGVkIGJ5IHRoZSBhc20gd3JhcHBlci4NCiAqLw0KX19hcm0gdm9pZCB2RU1BQ0lTUiggdm9pZCApOw0KDQovKg0KICogSW5pdGlhbGlzZSBib3RoIHRoZSBUeCBhbmQgUnggZGVzY3JpcHRvcnMgdXNlZCBieSB0aGUgRU1BQy4NCiAqLw0Kc3RhdGljIHZvaWQgcHJ2U2V0dXBEZXNjcmlwdG9ycyh2b2lkKTsNCg0KLyoNCiAqIFdyaXRlIG91ciBNQUMgYWRkcmVzcyBpbnRvIHRoZSBFTUFDLiAgVGhlIE1BQyBhZGRyZXNzIGlzIHNldCBhcyBvbmUgb2YgdGhlDQogKiB1aXAgb3B0aW9ucy4NCiAqLw0Kc3RhdGljIHZvaWQgcHJ2U2V0dXBNQUNBZGRyZXNzKCB2b2lkICk7DQoNCi8qDQogKiBDb25maWd1cmUgdGhlIEVNQUMgYW5kIEFJQyBmb3IgRU1BQyBpbnRlcnJ1cHRzLg0KICovDQpzdGF0aWMgdm9pZCBwcnZTZXR1cEVNQUNJbnRlcnJ1cHQoIHZvaWQgKTsNCg0KLyoNCiAqIFNvbWUgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb25zIHRha2VuIGZyb20gdGhlIEF0bWVsIEVNQUMgc2FtcGxlIGNvZGUuDQogKi8NCnN0YXRpYyB2b2lkIHZSZWFkUEhZKCB1bnNpZ25lZCBjaGFyIHVjUEhZQWRkcmVzcywgdW5zaWduZWQgY2hhciB1Y0FkZHJlc3MsIHVuc2lnbmVkIGxvbmcgKnB1bFZhbHVlICk7DQojaWYgVVNFX1JNSUlfSU5URVJGQUNFICE9IDENCglzdGF0aWMgdm9pZCB2V3JpdGVQSFkoIHVuc2lnbmVkIGNoYXIgdWNQSFlBZGRyZXNzLCB1bnNpZ25lZCBjaGFyIHVjQWRkcmVzcywgdW5zaWduZWQgbG9uZyB1bFZhbHVlKTsNCiNlbmRpZg0Kc3RhdGljIHBvcnRCQVNFX1RZUEUgeEdldExpbmtTcGVlZCggdm9pZCApOw0Kc3RhdGljIHBvcnRCQVNFX1RZUEUgcHJ2UHJvYmVQSFkoIHZvaWQgKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qIEJ1ZmZlciB3cml0dGVuIHRvIGJ5IHRoZSBFTUFDIERNQS4gIE11c3QgYmUgYWxpZ25lZCBhcyBkZXNjcmliZWQgYnkgdGhlDQpjb21tZW50IGFib3ZlIHRoZSBlbWFjQUREUkVTU19NQVNLIGRlZmluaXRpb24uICovDQojcHJhZ21hIGRhdGFfYWxpZ25tZW50PTgNCnN0YXRpYyB2b2xhdGlsZSBjaGFyIHBjUnhCdWZmZXJbIE5CX1JYX0JVRkZFUlMgKiBFVEhfUlhfQlVGRkVSX1NJWkUgXTsNCg0KLyogQnVmZmVyIHJlYWQgYnkgdGhlIEVNQUMgRE1BLiAgTXVzdCBiZSBhbGlnbmVkIGFzIGRlc2NyaWJlZCBieSBoZSBjb21tZW50DQphYm92ZSB0aGUgZW1hY0FERFJFU1NfTUFTSyBkZWZpbml0aW9uLiAqLw0KI3ByYWdtYSBkYXRhX2FsaWdubWVudD04DQpzdGF0aWMgY2hhciBwY1R4QnVmZmVyWyBOQl9UWF9CVUZGRVJTICogRVRIX1RYX0JVRkZFUl9TSVpFIF07DQoNCi8qIERlc2NyaXB0b3JzIHVzZWQgdG8gY29tbXVuaWNhdGUgYmV0d2VlbiB0aGUgcHJvZ3JhbSBhbmQgdGhlIEVNQUMgcGVyaXBoZXJhbC4NClRoZXNlIGRlc2NyaXB0b3JzIGhvbGQgdGhlIGxvY2F0aW9ucyBhbmQgc3RhdGUgb2YgdGhlIFJ4IGFuZCBUeCBidWZmZXJzLiAqLw0Kc3RhdGljIHZvbGF0aWxlIEFUOTFTX1R4VGREZXNjcmlwdG9yIHhUeERlc2NyaXB0b3JzWyBOQl9UWF9CVUZGRVJTIF07DQpzdGF0aWMgdm9sYXRpbGUgQVQ5MVNfUnhUZERlc2NyaXB0b3IgeFJ4RGVzY3JpcHRvcnNbIE5CX1JYX0JVRkZFUlMgXTsNCg0KLyogVGhlIElQIGFuZCBFdGhlcm5ldCBhZGRyZXNzZXMgYXJlIHJlYWQgZnJvbSB0aGUgdUlQIHNldHVwLiAqLw0KY29uc3QgY2hhciBjTUFDQWRkcmVzc1sgNiBdID0geyBVSVBfRVRIQUREUjAsIFVJUF9FVEhBRERSMSwgVUlQX0VUSEFERFIyLCBVSVBfRVRIQUREUjMsIFVJUF9FVEhBRERSNCwgVUlQX0VUSEFERFI1IH07DQpjb25zdCB1bnNpZ25lZCBjaGFyIHVjSVBBZGRyZXNzWyA0IF0gID0geyBVSVBfSVBBRERSMCwgVUlQX0lQQUREUjEsIFVJUF9JUEFERFIyLCBVSVBfSVBBRERSMyB9Ow0KDQovKiBUaGUgc2VtYXBob3JlIHVzZWQgYnkgdGhlIEVNQUMgSVNSIHRvIHdha2UgdGhlIEVNQUMgdGFzay4gKi8NCnN0YXRpYyBTZW1hcGhvcmVIYW5kbGVfdCB4U2VtYXBob3JlID0gTlVMTDsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNClNlbWFwaG9yZUhhbmRsZV90IHhFTUFDSW5pdCggdm9pZCApDQp7DQoJLyogQ29kZSBzdXBwbGllZCBieSBBdG1lbCAobW9kaWZpZWQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KCS8qIGRpc2FibGUgcHVsbCB1cCBvbiBSWERWID0+IFBIWSBub3JtYWwgbW9kZSAobm90IGluIHRlc3QgbW9kZSksDQoJUEhZIGhhcyBpbnRlcm5hbCBwdWxsIGRvd24uICovDQoJQVQ5MUNfQkFTRV9QSU9CLT5QSU9fUFBVRFIgPSAxIDw8IDE1Ow0KDQoJI2lmIFVTRV9STUlJX0lOVEVSRkFDRSAhPSAxDQoJICAJLyogUEhZIGhhcyBpbnRlcm5hbCBwdWxsIGRvd24gOiBzZXQgTUlJIG1vZGUuICovDQoJICAJQVQ5MUNfQkFTRV9QSU9CLT5QSU9fUFBVRFI9IDEgPDwgMTY7DQoJI2VuZGlmDQoNCgkvKiBjbGVhciBQQjE4IDw9PiBQSFkgcG93ZXJkb3duLiAqLw0KCUFUOTFGX1BJT19DZmdPdXRwdXQoIEFUOTFDX0JBU0VfUElPQiwgMSA8PCAxOCApIDsNCglBVDkxRl9QSU9fQ2xlYXJPdXRwdXQoIEFUOTFDX0JBU0VfUElPQiwgIDEgPDwgMTgpIDsNCg0KCS8qIEFmdGVyIFBIWSBwb3dlciB1cCwgaGFyZHdhcmUgcmVzZXQuICovDQoJQVQ5MUNfQkFTRV9SU1RDLT5SU1RDX1JNUiA9IGVtYWNSRVNFVF9LRVkgfCBlbWFjUkVTRVRfTEVOR1RIOw0KCUFUOTFDX0JBU0VfUlNUQy0+UlNUQ19SQ1IgPSBlbWFjUkVTRVRfS0VZIHwgQVQ5MUNfUlNUQ19FWFRSU1Q7DQoJDQoJLyogV2FpdCBmb3IgaGFyZHdhcmUgcmVzZXQgZW5kLiAqLw0KCXdoaWxlKCAhKCBBVDkxQ19CQVNFX1JTVEMtPlJTVENfUlNSICYgQVQ5MUNfUlNUQ19OUlNUTCApICkNCgl7DQoJCV9fYXNtKCAiTk9QIiApOw0KCX0NCglfX2FzbSggIk5PUCIgKTsNCiAgCQ0KCS8qIEVNQUMgSU8gaW5pdCBmb3IgRU1BQy1QSFkgY29tLiBSZW1vdmUgRUYxMDAgY29uZmlnLiAqLw0KCUFUOTFGX0VNQUNfQ2ZnUElPKCk7DQoNCgkvKiBFbmFibGUgY29tIGJldHdlZW4gRU1BQyBQSFkuDQoNCglFbmFibGUgbWFuYWdlbWVudCBwb3J0LiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ1IgfD0gQVQ5MUNfRU1BQ19NUEU7CQ0KDQoJLyogTURDID0gTUNLLzMyLiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ0ZHUiB8PSAoIDIgKSA8PCAxMDsJDQoNCgkvKiBXYWl0IGZvciBQSFkgYXV0byBpbml0IGVuZCAocmF0aGVyIGNydWRlIGRlbGF5ISkuICovDQoJdlRhc2tEZWxheSggZW1hY1BIWV9JTklUX0RFTEFZICk7DQoNCgkvKiBQSFkgY29uZmlndXJhdGlvbi4gKi8NCgkjaWYgVVNFX1JNSUlfSU5URVJGQUNFICE9IDENCgl7DQoJCXVuc2lnbmVkIGxvbmcgdWxDb250cm9sOw0KDQoJCS8qIFBIWSBoYXMgaW50ZXJuYWwgcHVsbCBkb3duIDogZGlzYWJsZSBNSUkgaXNvbGF0ZS4gKi8NCgkJdlJlYWRQSFkoIEFUOTFDX1BIWV9BRERSLCBNSUlfQk1DUiwgJnVsQ29udHJvbCApOw0KCQl2UmVhZFBIWSggQVQ5MUNfUEhZX0FERFIsIE1JSV9CTUNSLCAmdWxDb250cm9sICk7DQoJCXVsQ29udHJvbCAmPSB+Qk1DUl9JU09MQVRFOw0KCQl2V3JpdGVQSFkoIEFUOTFDX1BIWV9BRERSLCBNSUlfQk1DUiwgdWxDb250cm9sICk7DQoJfQ0KCSNlbmRpZg0KDQoJLyogRGlzYWJsZSBtYW5hZ2VtZW50IHBvcnQgYWdhaW4uICovDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DUiAmPSB+QVQ5MUNfRU1BQ19NUEU7DQoNCgkjaWYgVVNFX1JNSUlfSU5URVJGQUNFICE9IDENCgkJLyogRW5hYmxlIEVNQUMgaW4gTUlJIG1vZGUsIGVuYWJsZSBjbG9jayBFUlhDSyBhbmQgRVRYQ0suICovDQoJCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19VU1JJTyA9IEFUOTFDX0VNQUNfQ0xLRU4gOw0KCSNlbHNlDQoJCS8qIEVuYWJsZSBFTUFDIGluIFJNSUkgbW9kZSwgZW5hYmxlIFJNSUkgY2xvY2sgKDUwTUh6IGZyb20gb3NjaWxsYXRvcg0KCQlvbiBFUkZDSykuICovDQoJCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19VU1JJTyA9IEFUOTFDX0VNQUNfUk1JSSB8IEFUOTFDX0VNQUNfQ0xLRU4gOw0KCSNlbmRpZg0KDQoJLyogRW5kIG9mIGNvZGUgc3VwcGxpZWQgYnkgQXRtZWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KCS8qIFNldHVwIHRoZSBidWZmZXJzIGFuZCBkZXNjcmlwdG9ycy4gKi8NCglwcnZTZXR1cERlc2NyaXB0b3JzKCk7DQoJDQoJLyogTG9hZCBvdXIgTUFDIGFkZHJlc3MgaW50byB0aGUgRU1BQy4gKi8NCglwcnZTZXR1cE1BQ0FkZHJlc3MoKTsNCg0KCS8qIFRyeSB0byBjb25uZWN0LiAqLw0KCWlmKCBwcnZQcm9iZVBIWSgpICkNCgl7DQoJCS8qIEVuYWJsZSB0aGUgaW50ZXJydXB0ISAqLw0KCQlwcnZTZXR1cEVNQUNJbnRlcnJ1cHQoKTsNCgl9DQoNCglyZXR1cm4geFNlbWFwaG9yZTsNCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpsb25nIGxFTUFDU2VuZCggdm9pZCApDQp7DQpzdGF0aWMgdW5zaWduZWQgcG9ydEJBU0VfVFlQRSB1eFR4QnVmZmVySW5kZXggPSAwOw0KcG9ydEJBU0VfVFlQRSB4V2FpdEN5Y2xlcyA9IDA7DQpsb25nIGxSZXR1cm4gPSBwZFBBU1M7DQpjaGFyICpwY0J1ZmZlcjsNCg0KCS8qIElzIGEgYnVmZmVyIGF2YWlsYWJsZT8gKi8NCgl3aGlsZSggISggeFR4RGVzY3JpcHRvcnNbIHV4VHhCdWZmZXJJbmRleCBdLlVfU3RhdHVzLnN0YXR1cyAmIEFUOTFDX1RSQU5TTUlUX09LICkgKQ0KCXsNCgkJLyogVGhlcmUgaXMgbm8gcm9vbSB0byB3cml0ZSB0aGUgVHggZGF0YSB0byB0aGUgVHggYnVmZmVyLiAgV2FpdCBhDQoJCXNob3J0IHdoaWxlLCB0aGVuIHRyeSBhZ2Fpbi4gKi8NCgkJeFdhaXRDeWNsZXMrKzsNCgkJaWYoIHhXYWl0Q3ljbGVzID4gZW1hY01BWF9XQUlUX0NZQ0xFUyApDQoJCXsNCgkJCS8qIEdpdmUgdXAuICovDQoJCQlsUmV0dXJuID0gcGRGQUlMOw0KCQkJYnJlYWs7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQl2VGFza0RlbGF5KCBlbWFjQlVGRkVSX1dBSVRfREVMQVkgKTsNCgkJfQ0KCX0NCg0KCS8qIGxSZXR1cm4gd2lsbCBvbmx5IGJlIHBkUEFTUyBpZiBhIGJ1ZmZlciBpcyBhdmFpbGFibGUuICovDQoJaWYoIGxSZXR1cm4gPT0gcGRQQVNTICkNCgl7DQoJCS8qIENvcHkgdGhlIGhlYWRlcnMgaW50byB0aGUgVHggYnVmZmVyLiAgVGhlc2Ugd2lsbCBiZSBpbiB0aGUgdUlQIGJ1ZmZlci4gKi8NCgkJcGNCdWZmZXIgPSAoIGNoYXIgKiApIHhUeERlc2NyaXB0b3JzWyB1eFR4QnVmZmVySW5kZXggXS5hZGRyOw0KCQltZW1jcHkoICggdm9pZCAqICkgcGNCdWZmZXIsICggdm9pZCAqICkgdWlwX2J1ZiwgZW1hY1RPVEFMX0ZSQU1FX0hFQURFUl9TSVpFICk7DQoJCWlmKCB1aXBfbGVuID4gZW1hY1RPVEFMX0ZSQU1FX0hFQURFUl9TSVpFICkNCgkJew0KCQkJbWVtY3B5KCAoIHZvaWQgKiApICYoIHBjQnVmZmVyWyBlbWFjVE9UQUxfRlJBTUVfSEVBREVSX1NJWkUgXSApLCAoIHZvaWQgKiApIHVpcF9hcHBkYXRhLCAoIHVpcF9sZW4gLSBlbWFjVE9UQUxfRlJBTUVfSEVBREVSX1NJWkUgKSApOw0KCQl9DQoNCgkJLyogU2VuZC4gKi8JDQoJCXBvcnRFTlRFUl9DUklUSUNBTCgpOw0KCQl7DQoJCQlpZiggdXhUeEJ1ZmZlckluZGV4ID49ICggTkJfVFhfQlVGRkVSUyAtIDEgKSApDQoJCQl7DQoJCQkJLyogRmlsbCBvdXQgdGhlIG5lY2Vzc2FyeSBpbiB0aGUgZGVzY3JpcHRvciB0byBnZXQgdGhlIGRhdGEgc2VudC4gKi8NCgkJCQl4VHhEZXNjcmlwdG9yc1sgdXhUeEJ1ZmZlckluZGV4IF0uVV9TdGF0dXMuc3RhdHVzID0gCSggdWlwX2xlbiAmICggdW5zaWduZWQgbG9uZyApIEFUOTFDX0xFTkdUSF9GUkFNRSApDQoJCQkJCQkJCQkJCQkJCQkJCQl8IEFUOTFDX0xBU1RfQlVGRkVSDQoJCQkJCQkJCQkJCQkJCQkJCQl8IEFUOTFDX1RSQU5TTUlUX1dSQVA7DQoJCQkJdXhUeEJ1ZmZlckluZGV4ID0gMDsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkvKiBGaWxsIG91dCB0aGUgbmVjZXNzYXJ5IGluIHRoZSBkZXNjcmlwdG9yIHRvIGdldCB0aGUgZGF0YSBzZW50LiAqLw0KCQkJCXhUeERlc2NyaXB0b3JzWyB1eFR4QnVmZmVySW5kZXggXS5VX1N0YXR1cy5zdGF0dXMgPSAJKCB1aXBfbGVuICYgKCB1bnNpZ25lZCBsb25nICkgQVQ5MUNfTEVOR1RIX0ZSQU1FICkNCgkJCQkJCQkJCQkJCQkJCQkJCXwgQVQ5MUNfTEFTVF9CVUZGRVI7DQoJCQkJdXhUeEJ1ZmZlckluZGV4Kys7DQoJCQl9DQoJDQoJCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNSIHw9IEFUOTFDX0VNQUNfVFNUQVJUOw0KCQl9DQoJCXBvcnRFWElUX0NSSVRJQ0FMKCk7DQoJfQ0KDQoJcmV0dXJuIGxSZXR1cm47DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KdW5zaWduZWQgbG9uZyB1bEVNQUNQb2xsKCB2b2lkICkNCnsNCnN0YXRpYyB1bnNpZ25lZCBwb3J0QkFTRV9UWVBFIHVsTmV4dFJ4QnVmZmVyID0gMDsNCnVuc2lnbmVkIGxvbmcgdWxTZWN0aW9uTGVuZ3RoID0gMCwgdWxMZW5ndGhTb0ZhciA9IDAsIHVsRU9GID0gcGRGQUxTRTsNCmNoYXIgKnBjU291cmNlOw0KDQoJLyogU2tpcCBhbnkgZnJhZ21lbnRzLiAqLw0KCXdoaWxlKCAoIHhSeERlc2NyaXB0b3JzWyB1bE5leHRSeEJ1ZmZlciBdLmFkZHIgJiBBVDkxQ19PV05FUlNISVBfQklUICkgJiYgISggeFJ4RGVzY3JpcHRvcnNbIHVsTmV4dFJ4QnVmZmVyIF0uVV9TdGF0dXMuc3RhdHVzICYgQVQ5MUNfU09GICkgKQ0KCXsNCgkJLyogTWFyayB0aGUgYnVmZmVyIGFzIGZyZWUgYWdhaW4uICovDQoJCXhSeERlc2NyaXB0b3JzWyB1bE5leHRSeEJ1ZmZlciBdLmFkZHIgJj0gfiggQVQ5MUNfT1dORVJTSElQX0JJVCApOwkJDQoJCXVsTmV4dFJ4QnVmZmVyKys7DQoJCWlmKCB1bE5leHRSeEJ1ZmZlciA+PSBOQl9SWF9CVUZGRVJTICkNCgkJew0KCQkJdWxOZXh0UnhCdWZmZXIgPSAwOw0KCQl9DQoJfQ0KDQoJLyogSXMgdGhlcmUgYSBwYWNrZXQgcmVhZHk/ICovDQoNCgl3aGlsZSggKCB4UnhEZXNjcmlwdG9yc1sgdWxOZXh0UnhCdWZmZXIgXS5hZGRyICYgQVQ5MUNfT1dORVJTSElQX0JJVCApICYmICF1bFNlY3Rpb25MZW5ndGggKQ0KCXsNCgkJcGNTb3VyY2UgPSAoIGNoYXIgKiApKCB4UnhEZXNjcmlwdG9yc1sgdWxOZXh0UnhCdWZmZXIgXS5hZGRyICYgZW1hY0FERFJFU1NfTUFTSyApOw0KCQl1bFNlY3Rpb25MZW5ndGggPSB4UnhEZXNjcmlwdG9yc1sgdWxOZXh0UnhCdWZmZXIgXS5VX1N0YXR1cy5zdGF0dXMgJiBlbWFjUlhfTEVOR1RIX0ZSQU1FOw0KDQoJCWlmKCB1bFNlY3Rpb25MZW5ndGggPT0gMCApDQoJCXsNCgkJCS8qIFRoZSBmcmFtZSBpcyBsb25nZXIgdGhhbiB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgdGhpcw0KCQkJZGVzY3JpcHRvciBzbyBjb3B5IHRoZSBlbnRpcmUgYnVmZmVyIHRvIHVJUCAtIHRoZW4gbW92ZSBvbnRvDQoJCQl0aGUgbmV4dCBkZXNjcmlwdG9yIHRvIGdldCB0aGUgcmVzdCBvZiB0aGUgZnJhbWUuICovDQoJCQlpZiggKCB1bExlbmd0aFNvRmFyICsgRVRIX1JYX0JVRkZFUl9TSVpFICkgPD0gVUlQX0JVRlNJWkUgKQ0KCQkJew0KCQkJCW1lbWNweSggJiggdWlwX2J1ZlsgdWxMZW5ndGhTb0ZhciBdICksIHBjU291cmNlLCBFVEhfUlhfQlVGRkVSX1NJWkUgKTsNCgkJCQl1bExlbmd0aFNvRmFyICs9IEVUSF9SWF9CVUZGRVJfU0laRTsNCgkJCX0JCQkNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCS8qIFRoaXMgaXMgdGhlIGxhc3Qgc2VjdGlvbiBvZiB0aGUgZnJhbWUuICBDb3B5IHRoZSBzZWN0aW9uIHRvDQoJCQl1SVAuICovDQoJCQlpZiggdWxTZWN0aW9uTGVuZ3RoIDwgVUlQX0JVRlNJWkUgKQ0KCQkJew0KCQkJCS8qIFRoZSBzZWN0aW9uIGxlbmd0aCBob2xkcyB0aGUgbGVuZ3RoIG9mIHRoZSBlbnRpcmUgZnJhbWUuDQoJCQkJdWxMZW5ndGhTb0ZhciBob2xkcyB0aGUgbGVuZ3RoIG9mIHRoZSBmcmFtZSBzZWN0aW9ucyBhbHJlYWR5DQoJCQkJY29waWVkIHRvIHVJUCwgc28gdGhlIGxlbmd0aCBvZiB0aGUgZmluYWwgc2VjdGlvbiBpcw0KCQkJCXVsU2VjdGlvbkxlbmd0aCAtIHVsTGVuZ3RoU29GYXI7ICovDQoJCQkJaWYoIHVsU2VjdGlvbkxlbmd0aCA+IHVsTGVuZ3RoU29GYXIgKQ0KCQkJCXsNCgkJCQkJbWVtY3B5KCAmKCB1aXBfYnVmWyB1bExlbmd0aFNvRmFyIF0gKSwgcGNTb3VyY2UsICggdWxTZWN0aW9uTGVuZ3RoIC0gdWxMZW5ndGhTb0ZhciApICk7DQoJCQkJfQ0KCQkJfQkJCQ0KDQoJCQkvKiBJcyB0aGlzIHRoZSBsYXN0IGJ1ZmZlciBmb3IgdGhlIGZyYW1lPyAgSWYgbm90IHdoeT8gKi8NCgkJCXVsRU9GID0geFJ4RGVzY3JpcHRvcnNbIHVsTmV4dFJ4QnVmZmVyIF0uVV9TdGF0dXMuc3RhdHVzICYgQVQ5MUNfRU9GOw0KCQl9DQoNCgkJLyogTWFyayB0aGUgYnVmZmVyIGFzIGZyZWUgYWdhaW4uICovDQoJCXhSeERlc2NyaXB0b3JzWyB1bE5leHRSeEJ1ZmZlciBdLmFkZHIgJj0gfiggQVQ5MUNfT1dORVJTSElQX0JJVCApOw0KDQoJCS8qIEluY3JlbWVudCB0byB0aGUgbmV4dCBidWZmZXIsIHdyYXBwaW5nIGlmIG5lY2Vzc2FyeS4gKi8NCgkJdWxOZXh0UnhCdWZmZXIrKzsNCgkJaWYoIHVsTmV4dFJ4QnVmZmVyID49IE5CX1JYX0JVRkZFUlMgKQ0KCQl7DQoJCQl1bE5leHRSeEJ1ZmZlciA9IDA7DQoJCX0NCgl9DQoNCgkvKiBJZiB3ZSBvYnRhaW5lZCBkYXRhIGJ1dCBmb3Igc29tZSByZWFzb24gZGlkIG5vdCBmaW5kIHRoZSBlbmQgb2YgdGhlDQoJZnJhbWUgdGhlbiBkaXNjYXJkIHRoZSBkYXRhIGFzIGl0IG11c3QgY29udGFpbiBhbiBlcnJvci4gKi8NCglpZiggIXVsRU9GICkNCgl7DQoJCXVsU2VjdGlvbkxlbmd0aCA9IDA7DQoJfQ0KDQoJcmV0dXJuIHVsU2VjdGlvbkxlbmd0aDsNCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpzdGF0aWMgdm9pZCBwcnZTZXR1cERlc2NyaXB0b3JzKHZvaWQpDQp7DQp1bnNpZ25lZCBwb3J0QkFTRV9UWVBFIHhJbmRleDsNCnVuc2lnbmVkIGxvbmcgdWxBZGRyZXNzOw0KDQoJLyogSW5pdGlhbGlzZSB4UnhEZXNjcmlwdG9ycyBkZXNjcmlwdG9yLiAqLw0KCWZvciggeEluZGV4ID0gMDsgeEluZGV4IDwgTkJfUlhfQlVGRkVSUzsgKyt4SW5kZXggKQ0KCXsNCgkJLyogQ2FsY3VsYXRlIHRoZSBhZGRyZXNzIG9mIHRoZSBudGggYnVmZmVyIHdpdGhpbiB0aGUgYXJyYXkuICovDQoJCXVsQWRkcmVzcyA9ICggdW5zaWduZWQgbG9uZyApKCBwY1J4QnVmZmVyICsgKCB4SW5kZXggKiBFVEhfUlhfQlVGRkVSX1NJWkUgKSApOw0KDQoJCS8qIFdyaXRlIHRoZSBidWZmZXIgYWRkcmVzcyBpbnRvIHRoZSBkZXNjcmlwdG9yLiAgVGhlIERNQSB3aWxsIHBsYWNlDQoJCXRoZSBkYXRhIGF0IHRoaXMgYWRkcmVzcyB3aGVuIHRoaXMgZGVzY3JpcHRvciBpcyBiZWluZyB1c2VkLiAgTWFzayBvZmYNCgkJdGhlIGJvdHRvbSBiaXRzIG9mIHRoZSBhZGRyZXNzIGFzIHRoZXNlIGhhdmUgc3BlY2lhbCBtZWFuaW5nLiAqLw0KCQl4UnhEZXNjcmlwdG9yc1sgeEluZGV4IF0uYWRkciA9IHVsQWRkcmVzcyAmIGVtYWNBRERSRVNTX01BU0s7DQoJfQkNCg0KCS8qIFRoZSBsYXN0IGJ1ZmZlciBoYXMgdGhlIHdyYXAgYml0IHNldCBzbyB0aGUgRU1BQyBrbm93cyB0byB3cmFwIGJhY2sNCgl0byB0aGUgZmlyc3QgYnVmZmVyLiAqLw0KCXhSeERlc2NyaXB0b3JzWyBOQl9SWF9CVUZGRVJTIC0gMSBdLmFkZHIgfD0gZW1hY1JYX1dSQVBfQklUOw0KDQoJLyogSW5pdGlhbGlzZSB4VHhEZXNjcmlwdG9ycy4gKi8NCglmb3IoIHhJbmRleCA9IDA7IHhJbmRleCA8IE5CX1RYX0JVRkZFUlM7ICsreEluZGV4ICkNCgl7DQoJCS8qIENhbGN1bGF0ZSB0aGUgYWRkcmVzcyBvZiB0aGUgbnRoIGJ1ZmZlciB3aXRoaW4gdGhlIGFycmF5LiAqLw0KCQl1bEFkZHJlc3MgPSAoIHVuc2lnbmVkIGxvbmcgKSggcGNUeEJ1ZmZlciArICggeEluZGV4ICogRVRIX1RYX0JVRkZFUl9TSVpFICkgKTsNCg0KCQkvKiBXcml0ZSB0aGUgYnVmZmVyIGFkZHJlc3MgaW50byB0aGUgZGVzY3JpcHRvci4gIFRoZSBETUEgd2lsbCByZWFkDQoJCWRhdGEgZnJvbSBoZXJlIHdoZW4gdGhlIGRlc2NyaXB0b3IgaXMgYmVpbmcgdXNlZC4gKi8NCgkJeFR4RGVzY3JpcHRvcnNbIHhJbmRleCBdLmFkZHIgPSB1bEFkZHJlc3MgJiBlbWFjQUREUkVTU19NQVNLOw0KCQl4VHhEZXNjcmlwdG9yc1sgeEluZGV4IF0uVV9TdGF0dXMuc3RhdHVzID0gQVQ5MUNfVFJBTlNNSVRfT0s7DQoJfQkNCg0KCS8qIFRoZSBsYXN0IGJ1ZmZlciBoYXMgdGhlIHdyYXAgYml0IHNldCBzbyB0aGUgRU1BQyBrbm93cyB0byB3cmFwIGJhY2sNCgl0byB0aGUgZmlyc3QgYnVmZmVyLiAqLw0KCXhUeERlc2NyaXB0b3JzWyBOQl9UWF9CVUZGRVJTIC0gMSBdLlVfU3RhdHVzLnN0YXR1cyA9IEFUOTFDX1RSQU5TTUlUX1dSQVAgfCBBVDkxQ19UUkFOU01JVF9PSzsNCg0KCS8qIFRlbGwgdGhlIEVNQUMgd2hlcmUgdG8gZmluZCB0aGUgZGVzY3JpcHRvcnMuICovDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX1JCUVAgPSAoIHVuc2lnbmVkIGxvbmcgKSB4UnhEZXNjcmlwdG9yczsNCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfVEJRUCA9ICggdW5zaWduZWQgbG9uZyApIHhUeERlc2NyaXB0b3JzOw0KCQ0KCS8qIENsZWFyIGFsbCB0aGUgYml0cyBpbiB0aGUgcmVjZWl2ZSBzdGF0dXMgcmVnaXN0ZXIuICovDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX1JTUiA9ICggQVQ5MUNfRU1BQ19PVlIgfCBBVDkxQ19FTUFDX1JFQyB8IEFUOTFDX0VNQUNfQk5BICk7DQoNCgkvKiBFbmFibGUgdGhlIGNvcHkgb2YgZGF0YSBpbnRvIHRoZSBidWZmZXJzLCBpZ25vcmUgYnJvYWRjYXN0cywNCglhbmQgZG9uJ3QgY29weSBGQ1MuICovDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DRkdSIHw9ICggQVQ5MUNfRU1BQ19DQUYgfCBBVDkxQ19FTUFDX05CQyB8IEFUOTFDX0VNQUNfRFJGQ1MpOw0KDQoJLyogRW5hYmxlIFJ4IGFuZCBUeCwgcGx1cyB0aGUgc3RhdHMgcmVnaXN0ZXIuICovDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DUiB8PSAoIEFUOTFDX0VNQUNfVEUgfCBBVDkxQ19FTUFDX1JFIHwgQVQ5MUNfRU1BQ19XRVNUQVQgKTsNCn0JDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0Kc3RhdGljIHZvaWQgcHJ2U2V0dXBNQUNBZGRyZXNzKCB2b2lkICkNCnsNCgkvKiBNdXN0IGJlIHdyaXR0ZW4gU0ExTCB0aGVuIFNBMUguICovDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX1NBMUwgPQkoICggdW5zaWduZWQgbG9uZyApIGNNQUNBZGRyZXNzWyAzIF0gPDwgMjQgKSB8DQoJCQkJCQkJCQkoICggdW5zaWduZWQgbG9uZyApIGNNQUNBZGRyZXNzWyAyIF0gPDwgMTYgKSB8DQoJCQkJCQkJCQkoICggdW5zaWduZWQgbG9uZyApIGNNQUNBZGRyZXNzWyAxIF0gPDwgOCAgKSB8DQoJCQkJCQkJCQljTUFDQWRkcmVzc1sgMCBdOw0KDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX1NBMUggPQkoICggdW5zaWduZWQgbG9uZyApIGNNQUNBZGRyZXNzWyA1IF0gPDwgOCApIHwNCgkJCQkJCQkJCWNNQUNBZGRyZXNzWyA0IF07DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0Kc3RhdGljIHZvaWQgcHJ2U2V0dXBFTUFDSW50ZXJydXB0KCB2b2lkICkNCnsNCgkvKiBDcmVhdGUgdGhlIHNlbWFwaG9yZSB1c2VkIHRvIHRyaWdnZXIgdGhlIEVNQUMgdGFzay4gKi8NCgl2U2VtYXBob3JlQ3JlYXRlQmluYXJ5KCB4U2VtYXBob3JlICk7DQoJaWYoIHhTZW1hcGhvcmUgKQ0KCXsNCgkJLyogV2Ugc3RhcnQgYnkgJ3Rha2luZycgdGhlIHNlbWFwaG9yZSBzbyB0aGUgSVNSIGNhbiAnZ2l2ZScgaXQgd2hlbiB0aGUNCgkJZmlyc3QgaW50ZXJydXB0IG9jY3Vycy4gKi8NCgkJeFNlbWFwaG9yZVRha2UoIHhTZW1hcGhvcmUsIGVtYWNOT19ERUxBWSApOw0KCQlwb3J0RU5URVJfQ1JJVElDQUwoKTsNCgkJew0KCQkJLyogV2Ugd2FudCB0byBpbnRlcnJ1cHQgb24gUnggZXZlbnRzLiAqLw0KCQkJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX0lFUiA9IEFUOTFDX0VNQUNfUkNPTVA7DQoNCgkJCS8qIEVuYWJsZSB0aGUgaW50ZXJydXB0cyBpbiB0aGUgQUlDLiAqLw0KCQkJQVQ5MUZfQUlDX0NvbmZpZ3VyZUl0KCBBVDkxQ19CQVNFX0FJQywgQVQ5MUNfSURfRU1BQywgZW1hY0lOVEVSUlVQVF9MRVZFTCwgQVQ5MUNfQUlDX1NSQ1RZUEVfSU5UX0hJR0hfTEVWRUwsICggdm9pZCAoKikoIHZvaWQgKSApIHZFTUFDSVNSRW50cnkgKTsNCgkJCUFUOTFGX0FJQ19FbmFibGVJdCggQVQ5MUNfQkFTRV9BSUMsIEFUOTFDX0lEX0VNQUMgKTsNCgkJfQ0KCQlwb3J0RVhJVF9DUklUSUNBTCgpOw0KCX0NCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpfX2FybSB2b2lkIHZFTUFDSVNSKCB2b2lkICkNCnsNCnZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgdWxJbnRTdGF0dXMsIHVsUnhTdGF0dXM7DQpwb3J0QkFTRV9UWVBFIHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiA9IHBkRkFMU0U7DQoNCgl1bEludFN0YXR1cyA9IEFUOTFDX0JBU0VfRU1BQy0+RU1BQ19JU1I7DQoJdWxSeFN0YXR1cyA9IEFUOTFDX0JBU0VfRU1BQy0+RU1BQ19SU1I7DQoNCglpZiggKCB1bEludFN0YXR1cyAmIEFUOTFDX0VNQUNfUkNPTVAgKSB8fCAoIHVsUnhTdGF0dXMgJiBBVDkxQ19FTUFDX1JFQyApICkNCgl7DQoJCS8qIEEgZnJhbWUgaGFzIGJlZW4gcmVjZWl2ZWQsIHNpZ25hbCB0aGUgdUlQIHRhc2sgc28gaXQgY2FuIHByb2Nlc3MNCgkJdGhlIFJ4IGRlc2NyaXB0b3JzLiAqLw0KCQl4U2VtYXBob3JlR2l2ZUZyb21JU1IoIHhTZW1hcGhvcmUsICZ4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKTsNCgkJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX1JTUiA9IEFUOTFDX0VNQUNfUkVDOw0KCX0NCg0KCS8qIElmIGEgdGFzayB3YXMgd29rZW4gYnkgZWl0aGVyIGEgY2hhcmFjdGVyIGJlaW5nIHJlY2VpdmVkIG9yIGEgY2hhcmFjdGVyDQoJYmVpbmcgdHJhbnNtaXR0ZWQgdGhlbiB3ZSBtYXkgbmVlZCB0byBzd2l0Y2ggdG8gYW5vdGhlciB0YXNrLiAqLw0KCXBvcnRFTkRfU1dJVENISU5HX0lTUiggeEhpZ2hlclByaW9yaXR5VGFza1dva2VuICk7DQoNCgkvKiBDbGVhciB0aGUgaW50ZXJydXB0LiAqLw0KCUFUOTFDX0JBU0VfQUlDLT5BSUNfRU9JQ1IgPSAwOw0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCg0KDQovKg0KICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9ucyB0YWtlbiBmcm9tIHRoZSBBdG1lbA0KICogRU1BQyBzYW1wbGUgY29kZS4NCiAqLw0KDQpzdGF0aWMgcG9ydEJBU0VfVFlQRSBwcnZQcm9iZVBIWSggdm9pZCApDQp7DQp1bnNpZ25lZCBsb25nIHVsUEhZSWQxLCB1bFBIWUlkMiwgdWxTdGF0dXM7DQpwb3J0QkFTRV9UWVBFIHhSZXR1cm4gPSBwZFBBU1M7DQoJDQoJLyogQ29kZSBzdXBwbGllZCBieSBBdG1lbCAocmVmb3JtYXR0ZWQpIC0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KCS8qIEVuYWJsZSBtYW5hZ2VtZW50IHBvcnQgKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNSIHw9IEFUOTFDX0VNQUNfTVBFOwkNCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgfD0gKCAyICkgPDwgMTA7DQoNCgkvKiBSZWFkIHRoZSBQSFkgSUQuICovDQoJdlJlYWRQSFkoIEFUOTFDX1BIWV9BRERSLCBNSUlfUEhZU0lEMSwgJnVsUEhZSWQxICk7DQoJdlJlYWRQSFkoIEFUOTFDX1BIWV9BRERSLCBNSUlfUEhZU0lEMiwgJnVsUEhZSWQyICk7DQoNCgkvKiBBTUQgQU03OUM4NzU6DQoJCQlQSFlfSUQxID0gMHgwMDIyDQoJCQlQSFlfSUQyID0gMHg1NTQxDQoJCQlCaXRzIDM6MCBSZXZpc2lvbiBOdW1iZXIgRm91ciBiaXQgbWFudWZhY3R1cmVyknMgcmV2aXNpb24gbnVtYmVyLg0KCQkJCTAwMDEgc3RhbmRzIGZvciBSZXYuIEEsIGV0Yy4NCgkqLw0KCWlmKCAoICggdWxQSFlJZDEgPDwgMTYgKSB8ICggdWxQSFlJZDIgJiAweGZmZjAgKSApICE9IE1JSV9ETTkxNjFfSUQgKQ0KCXsNCgkJLyogRGlkIG5vdCBleHBlY3QgdGhpcyBJRC4gKi8NCgkJeFJldHVybiA9IHBkRkFJTDsNCgl9DQoJZWxzZQ0KCXsNCgkJdWxTdGF0dXMgPSB4R2V0TGlua1NwZWVkKCk7DQoNCgkJaWYoIHVsU3RhdHVzICE9IHBkUEFTUyApDQoJCXsNCgkJCXhSZXR1cm4gPSBwZEZBSUw7DQoJCX0NCgl9DQoNCgkvKiBEaXNhYmxlIG1hbmFnZW1lbnQgcG9ydCAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ1IgJj0gfkFUOTFDX0VNQUNfTVBFOwkNCg0KCS8qIEVuZCBvZiBjb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCglyZXR1cm4geFJldHVybjsNCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpzdGF0aWMgdm9pZCB2UmVhZFBIWSggdW5zaWduZWQgY2hhciB1Y1BIWUFkZHJlc3MsIHVuc2lnbmVkIGNoYXIgdWNBZGRyZXNzLCB1bnNpZ25lZCBsb25nICpwdWxWYWx1ZSApDQp7DQoJLyogQ29kZSBzdXBwbGllZCBieSBBdG1lbCAocmVmb3JtYXR0ZWQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX01BTiA9IAkoQVQ5MUNfRU1BQ19TT0YgJiAoMHgwMTw8MzApKQ0KCQkJCQkJCQkJfCAoMiA8PCAxNikgfCAoMiA8PCAyOCkNCgkJCQkJCQkJCXwgKCh1Y1BIWUFkZHJlc3MgJiAweDFmKSA8PCAyMykNCgkJCQkJCQkJCXwgKHVjQWRkcmVzcyA8PCAxOCk7DQoNCgkvKiBXYWl0IHVudGlsIElETEUgYml0IGluIE5ldHdvcmsgU3RhdHVzIHJlZ2lzdGVyIGlzIGNsZWFyZWQuICovDQoJd2hpbGUoICEoIEFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OU1IgJiBBVDkxQ19FTUFDX0lETEUgKSApDQoJew0KCQlfX2FzbSggIk5PUCIgKTsNCgl9DQoNCgkqcHVsVmFsdWUgPSAoIEFUOTFDX0JBU0VfRU1BQy0+RU1BQ19NQU4gJiAweDAwMDBmZmZmICk7CQ0KDQoJLyogRW5kIG9mIGNvZGUgc3VwcGxpZWQgYnkgQXRtZWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQojaWYgVVNFX1JNSUlfSU5URVJGQUNFICE9IDENCnN0YXRpYyB2b2lkIHZXcml0ZVBIWSggdW5zaWduZWQgY2hhciB1Y1BIWUFkZHJlc3MsIHVuc2lnbmVkIGNoYXIgdWNBZGRyZXNzLCB1bnNpZ25lZCBsb25nIHVsVmFsdWUgKQ0Kew0KCS8qIENvZGUgc3VwcGxpZWQgYnkgQXRtZWwgKHJlZm9ybWF0dGVkKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19NQU4gPSAoKCBBVDkxQ19FTUFDX1NPRiAmICgweDAxPDwzMCkpDQoJCQkJCQkJCXwgKDIgPDwgMTYpIHwgKDEgPDwgMjgpDQoJCQkJCQkJCXwgKCh1Y1BIWUFkZHJlc3MgJiAweDFmKSA8PCAyMykNCgkJCQkJCQkJfCAodWNBZGRyZXNzIDw8IDE4KSkNCgkJCQkJCQkJfCAodWxWYWx1ZSAmIDB4ZmZmZik7DQoNCgkvKiBXYWl0IHVudGlsIElETEUgYml0IGluIE5ldHdvcmsgU3RhdHVzIHJlZ2lzdGVyIGlzIGNsZWFyZWQgKi8NCgl3aGlsZSggISggQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05TUiAmIEFUOTFDX0VNQUNfSURMRSApICkNCgl7DQoJCV9fYXNtKCAiTk9QIiApOw0KCX07DQoNCgkvKiBFbmQgb2YgY29kZSBzdXBwbGllZCBieSBBdG1lbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KfQ0KI2VuZGlmDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0Kc3RhdGljIHBvcnRCQVNFX1RZUEUgeEdldExpbmtTcGVlZCggdm9pZCApDQp7DQoJdW5zaWduZWQgbG9uZyB1bEJNU1IsIHVsQk1DUiwgdWxMUEEsIHVsTUFDQ2ZnLCB1bFNwZWVkLCB1bER1cGxleDsNCg0KCS8qIENvZGUgc3VwcGxpZWQgYnkgQXRtZWwgKHJlZm9ybWF0dGVkKSAtLS0tLS0tLS0tLS0tLS0tLSovDQoNCgkvKiBMaW5rIHN0YXR1cyBpcyBsYXRjaGVkLCBzbyByZWFkIHR3aWNlIHRvIGdldCBjdXJyZW50IHZhbHVlICovDQoJdlJlYWRQSFkoQVQ5MUNfUEhZX0FERFIsIE1JSV9CTVNSLCAmdWxCTVNSKTsNCgl2UmVhZFBIWShBVDkxQ19QSFlfQUREUiwgTUlJX0JNU1IsICZ1bEJNU1IpOw0KDQoJaWYoICEoIHVsQk1TUiAmIEJNU1JfTFNUQVRVUyApICkNCgl7CQ0KCQkvKiBObyBMaW5rLiAqLw0KCQlyZXR1cm4gcGRGQUlMOw0KCX0NCg0KCXZSZWFkUEhZKEFUOTFDX1BIWV9BRERSLCBNSUlfQk1DUiwgJnVsQk1DUik7DQoJaWYgKHVsQk1DUiAmIEJNQ1JfQU5FTkFCTEUpDQoJewkJCQkNCgkJLyogQXV0b05lZ290aWF0aW9uIGlzIGVuYWJsZWQuICovDQoJCWlmICghKHVsQk1TUiAmIEJNU1JfQU5FR0NPTVBMRVRFKSkNCgkJew0KCQkJLyogQXV0by1uZWdvdGlhdGlvbiBpbiBwcm9ncmVzcy4gKi8NCgkJCXJldHVybiBwZEZBSUw7CQkJCQ0KCQl9CQkNCg0KCQl2UmVhZFBIWShBVDkxQ19QSFlfQUREUiwgTUlJX0xQQSwgJnVsTFBBKTsNCgkJaWYoICggdWxMUEEgJiBMUEFfMTAwRlVMTCApIHx8ICggdWxMUEEgJiBMUEFfMTAwSEFMRiApICkNCgkJew0KCQkJdWxTcGVlZCA9IFNQRUVEXzEwMDsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXVsU3BlZWQgPSBTUEVFRF8xMDsNCgkJfQ0KDQoJCWlmKCAoIHVsTFBBICYgTFBBXzEwMEZVTEwgKSB8fCAoIHVsTFBBICYgTFBBXzEwRlVMTCApICkNCgkJew0KCQkJdWxEdXBsZXggPSBEVVBMRVhfRlVMTDsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXVsRHVwbGV4ID0gRFVQTEVYX0hBTEY7DQoJCX0NCgl9DQoJZWxzZQ0KCXsNCgkJdWxTcGVlZCA9ICggdWxCTUNSICYgQk1DUl9TUEVFRDEwMCApID8gU1BFRURfMTAwIDogU1BFRURfMTA7DQoJCXVsRHVwbGV4ID0gKCB1bEJNQ1IgJiBCTUNSX0ZVTExEUExYICkgPyBEVVBMRVhfRlVMTCA6IERVUExFWF9IQUxGOw0KCX0NCg0KCS8qIFVwZGF0ZSB0aGUgTUFDICovDQoJdWxNQUNDZmcgPSBBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgJiB+KCBBVDkxQ19FTUFDX1NQRCB8IEFUOTFDX0VNQUNfRkQgKTsNCglpZiggdWxTcGVlZCA9PSBTUEVFRF8xMDAgKQ0KCXsNCgkJaWYoIHVsRHVwbGV4ID09IERVUExFWF9GVUxMICkNCgkJew0KCQkJLyogMTAwIEZ1bGwgRHVwbGV4ICovDQoJCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgPSB1bE1BQ0NmZyB8IEFUOTFDX0VNQUNfU1BEIHwgQVQ5MUNfRU1BQ19GRDsNCgkJfQ0KCQllbHNlDQoJCXsJCQkJCQ0KCQkJLyogMTAwIEhhbGYgRHVwbGV4ICovDQoJCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgPSB1bE1BQ0NmZyB8IEFUOTFDX0VNQUNfU1BEOw0KCQl9DQoJfQ0KCWVsc2UNCgl7DQoJCWlmICh1bER1cGxleCA9PSBEVVBMRVhfRlVMTCkNCgkJew0KCQkJLyogMTAgRnVsbCBEdXBsZXggKi8NCgkJCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ0ZHUiA9IHVsTUFDQ2ZnIHwgQVQ5MUNfRU1BQ19GRDsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCS8qIDEwIEhhbGYgRHVwbGV4ICovDQoJCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgPSB1bE1BQ0NmZzsNCgkJfQ0KCX0NCg0KCS8qIEVuZCBvZiBjb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCglyZXR1cm4gcGRQQVNTOw0KfQ0K