LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAqIChjKSBDb3B5cmlnaHQgMjAwOCBBY3RlbCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogKiANCiAqIFNtYXJ0RnVzaW9uIG1pY3JvY29udHJvbGxlciBzdWJzeXN0ZW0gU1BJIGJhcmUgbWV0YWwgc29mdHdhcmUgZHJpdmVyIHB1YmxpYyBBUEkuDQogKg0KICogVGhlIG1pY3JvY29udHJvbGxlciBzdWJzeXN0ZW0gU1BJIGRyaXZlciBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIGltcGxlbWVudGluZw0KICogU1BJIG1hc3RlciBvciBTUEkgc2xhdmUgb3BlcmF0aW9ucy4gVGhlc2Ugb3BlcmF0aW9ucyBjYW4gYmUgb25lIG9mIHR3bw0KICogY2xhc3NlczogU1BJIGZyYW1lIG9wZXJhdGlvbiBvciBibG9jayB0cmFuc2ZlciBvcGVyYXRpb25zLg0KICogRnJhbWUgb3BlcmF0aW9ucyBhbGxvdyB0cmFuc2ZlcnJpbmcgU1BJIGZyYW1lcyBmcm9tIDQgdG8gMzIgYml0cyBsb25nLiBCbG9jaw0KICogb3BlcmF0aW9ucyBhbGxvdyB0cmFuc2ZlcnJpbmcgYmxvY2tzIG9mIGRhdGEgb3JnYW5pemVkIGFzIDggYml0IGJ5dGVzLiANCiAqDQogKiBTVk4gJFJldmlzaW9uOiAyMTg5ICQNCiAqIFNWTiAkRGF0ZTogMjAxMC0wMi0xNiAyMjowMjozMiArMDAwMCAoVHVlLCAxNiBGZWIgMjAxMCkgJA0KICovDQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLy8qKg0KICBAbWFpbnBhZ2UgU21hcnRGdXNpb24gTVNTIFNQSSBCYXJlIE1ldGFsIERyaXZlci4NCg0KICBAc2VjdGlvbiBpbnRyb19zZWMgSW50cm9kdWN0aW9uDQogIFRoZSBTbWFydEZ1c2lvbpkgbWljcm9jb250cm9sbGVyIHN1YnN5c3RlbSAoTVNTKSBpbmNsdWRlcyB0d28gc2VyaWFsDQogIHBlcmlwaGVyYWwgaW50ZXJmYWNlIFNQSSBwZXJpcGhlcmFscyBmb3Igc2VyaWFsIGNvbW11bmljYXRpb24uIFRoaXMgZHJpdmVyDQogIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBmb3IgY29udHJvbGxpbmcgdGhlIE1TUyBTUElzIGFzIHBhcnQgb2YgYSBiYXJlDQogIG1ldGFsIHN5c3RlbSB3aGVyZSBubyBvcGVyYXRpbmcgc3lzdGVtIGlzIGF2YWlsYWJsZS4gVGhlc2UgZHJpdmVycyBjYW4gYmUNCiAgYWRhcHRlZCBmb3IgdXNlIGFzIHBhcnQgb2YgYW4gb3BlcmF0aW5nIHN5c3RlbSwgYnV0IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUNCiAgYWRhcHRhdGlvbiBsYXllciBiZXR3ZWVuIHRoaXMgZHJpdmVyIGFuZCB0aGUgb3BlcmF0aW5nIHN5c3RlbSdzIGRyaXZlciBtb2RlbA0KICBpcyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIGRyaXZlci4NCiAgDQogIEBzZWN0aW9uIGh3X2RlcGVuZGVuY2llcyBIYXJkd2FyZSBGbG93IERlcGVuZGVuY2llcw0KICBUaGUgY29uZmlndXJhdGlvbiBvZiBhbGwgZmVhdHVyZXMgb2YgdGhlIE1TUyBTUElzIGlzIGNvdmVyZWQgYnkgdGhpcyBkcml2ZXINCiAgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBTbWFydEZ1c2lvbiBJT01VWCBjb25maWd1cmF0aW9uLiBTbWFydEZ1c2lvbiBhbGxvd3MNCiAgbXVsdGlwbGUgbm9uLWNvbmN1cnJlbnQgdXNlcyBvZiBzb21lIGV4dGVybmFsIHBpbnMgdGhyb3VnaCBJT01VWCBjb25maWd1cmF0aW9uLg0KICBUaGlzIGZlYXR1cmUgYWxsb3dzIG9wdGltaXphdGlvbiBvZiBleHRlcm5hbCBwaW4gdXNhZ2UgYnkgYXNzaWduaW5nIGV4dGVybmFsDQogIHBpbnMgZm9yIHVzZSBieSBlaXRoZXIgdGhlIG1pY3JvY29udHJvbGxlciBzdWJzeXN0ZW0gb3IgdGhlIEZQR0EgZmFicmljLiBUaGUNCiAgTVNTIFNQSXMgc2VyaWFsIHNpZ25hbHMgYXJlIHJvdXRlZCB0aHJvdWdoIElPTVVYZXMgdG8gdGhlIFNtYXJ0RnVzaW9uIGRldmljZQ0KICBleHRlcm5hbCBwaW5zLiBUaGVzZSBJT01VWGVzIGFyZSBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZWQgY29ycmVjdGx5IGJ5IHRoZSBNU1MNCiAgY29uZmlndXJhdG9yIHRvb2wgaW4gdGhlIGhhcmR3YXJlIGZsb3cgd2hlbiB0aGUgTVNTIFNQSXMgYXJlIGVuYWJsZWQgaW4gdGhhdA0KICB0b29sLiBZb3UgbXVzdCBlbnN1cmUgdGhhdCB0aGUgTVNTIFNQSXMgYXJlIGVuYWJsZWQgYnkgdGhlIE1TUyBjb25maWd1cmF0b3INCiAgdG9vbCBpbiB0aGUgaGFyZHdhcmUgZmxvdzsgb3RoZXJ3aXNlIHRoZSBzZXJpYWwgaW5wdXRzIGFuZCBvdXRwdXRzIHdpbGwgbm90IGJlDQogIGNvbm5lY3RlZCB0byB0aGUgY2hpcCdzIGV4dGVybmFsIHBpbnMuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIElPTVVYLCByZWZlciB0bw0KICB0aGUgSU9NVVggc2VjdGlvbiBvZiB0aGUgU21hcnRGdXNpb24gRGF0YXNoZWV0Lg0KICBUaGUgYmFzZSBhZGRyZXNzLCByZWdpc3RlciBhZGRyZXNzZXMgYW5kIGludGVycnVwdCBudW1iZXIgYXNzaWdubWVudCBmb3IgdGhlDQogIE1TUyBTUEkgYmxvY2tzIGFyZSBkZWZpbmVkIGFzIGNvbnN0YW50cyBpbiB0aGUgU21hcnRGdXNpb24gQ01TSVMtUEFMLiBZb3UgbXVzdA0KICBlbnN1cmUgdGhhdCB0aGUgU21hcnRGdXNpb24gQ01TSVMtUEFMIGlzIGVpdGhlciBpbmNsdWRlZCBpbiB0aGUgc29mdHdhcmUgdG9vbA0KICBjaGFpbiB1c2VkIHRvIGJ1aWxkIHlvdXIgcHJvamVjdCBvciBpcyBpbmNsdWRlZCBpbiB5b3VyIHByb2plY3QuDQogIA0KICBAc2VjdGlvbiB0aGVvcnlfb3AgVGhlb3J5IG9mIE9wZXJhdGlvbg0KICBUaGUgTVNTIFNQSSBkcml2ZXIgZnVuY3Rpb25zIGFyZSBncm91cGVkIGludG8gdGhlIGZvbGxvd2luZyBjYXRlZ29yaWVzOg0KICAgIJUgSW5pdGlhbGl6YXRpb24NCiAgICCVIENvbmZpZ3VyYXRpb24gZm9yIGVpdGhlciBtYXN0ZXIgb3Igc2xhdmUgb3BlcmF0aW9ucw0KICAgIJUgU1BJIG1hc3RlciBmcmFtZSB0cmFuc2ZlciBjb250cm9sDQogICAglSBTUEkgbWFzdGVyIGJsb2NrIHRyYW5zZmVyIGNvbnRyb2wNCiAgICCVIFNQSSBzbGF2ZSBmcmFtZSB0cmFuc2ZlciBjb250cm9sDQogICAglSBTUEkgc2xhdmUgYmxvY2sgdHJhbnNmZXIgY29udHJvbA0KICAgIJUgRE1BIGJsb2NrIHRyYW5zZmVyDQogIEZyYW1lIHRyYW5zZmVycyBhbGxvdyB0aGUgTVNTIFNQSSB0byB3cml0ZSBvciByZWFkIHVwIHRvIDMyIGJpdHMgb2YgZGF0YSBpbiBhDQogIFNQSSB0cmFuc2FjdGlvbi4gRm9yIGV4YW1wbGUsIGEgZnJhbWUgdHJhbnNmZXIgb2YgMTIgYml0cyBtaWdodCBiZSB1c2VkIHRvDQogIHJlYWQgdGhlIHJlc3VsdCBvZiBhbiBBREMgY29udmVyc2lvbiBmcm9tIGEgU1BJIGFuYWxvZyB0byBkaWdpdGFsIGNvbnZlcnRlci4NCiAgQmxvY2sgdHJhbnNmZXJzIGFsbG93IHRoZSBNU1MgU1BJIHRvIHdyaXRlIG9yIHJlYWQgYSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBTUEkNCiAgdHJhbnNhY3Rpb24uIEJsb2NrIHRyYW5zZmVyIHRyYW5zYWN0aW9ucyBhbGxvdyBkYXRhIHRyYW5zZmVycyBpbiBtdWx0aXBsZXMgb2YNCiAgOCBiaXRzICg4LCAxNiwgMjQsIDMyLCA0MIUpLiBCbG9jayB0cmFuc2ZlcnMgYXJlIHR5cGljYWxseSB1c2VkIHdpdGggYnl0ZQ0KICBvcmllbnRlZCBkZXZpY2VzIGxpa2UgU1BJIEZMQVNIIGRldmljZXMuDQoNCiAgSW5pdGlhbGl6YXRpb24gDQogICAgVGhlIE1TUyBTUEkgZHJpdmVyIGlzIGluaXRpYWxpemVkIHRocm91Z2ggYSBjYWxsIHRvIHRoZSBNU1NfU1BJX2luaXQoKQ0KICAgIGZ1bmN0aW9uLiBUaGUgTVNTX1NQSV9pbml0KCkgZnVuY3Rpb24gdGFrZXMgb25seSBvbmUgcGFyYW1ldGVyLCBhIHBvaW50ZXINCiAgICB0byBvbmUgb2YgdHdvIGdsb2JhbCBkYXRhIHN0cnVjdHVyZXMgdXNlZCBieSB0aGUgZHJpdmVyIHRvIHN0b3JlIHN0YXRlDQogICAgaW5mb3JtYXRpb24gZm9yIGVhY2ggTVNTIFNQSS4gQSBwb2ludGVyIHRvIHRoZXNlIGRhdGEgc3RydWN0dXJlcyBpcyBhbHNvDQogICAgdXNlZCBhcyBmaXJzdCBwYXJhbWV0ZXIgdG8gYW55IG9mIHRoZSBkcml2ZXIgZnVuY3Rpb25zIHRvIGlkZW50aWZ5IHdoaWNoIE1TUw0KICAgIFNQSSB3aWxsIGJlIHVzZWQgYnkgdGhlIGNhbGxlZCBmdW5jdGlvbi4gVGhlIG5hbWVzIG9mIHRoZXNlIHR3byBkYXRhDQogICAgc3RydWN0dXJlcyBhcmUgZ19tc3Nfc3BpMCBhbmQgZ19tc3Nfc3BpMS4gVGhlcmVmb3JlIGFueSBjYWxsIHRvIGFuIE1TUyBTUEkNCiAgICBkcml2ZXIgZnVuY3Rpb24gc2hvdWxkIGJlIG9mIHRoZSBmb3JtIE1TU19TUElfZnVuY3Rpb25fbmFtZSggJmdfbXNzX3NwaTAsIC4uLiApDQogICAgb3IgTVNTX1NQSV9mdW5jdGlvbl9uYW1lKCAmZ19tc3Nfc3BpMSwgLi4uICkuDQogICAgVGhlIE1TU19TUElfaW5pdCgpIGZ1bmN0aW9uIHJlc2V0cyB0aGUgc3BlY2lmaWVkIE1TUyBTUEkgaGFyZHdhcmUgYmxvY2sgYW5kDQogICAgY2xlYXJzIGFueSBwZW5kaW5nIGludGVycnVwdHMgZnJvbSB0aGF0IE1TUyBTUEkgaW4gdGhlIENvcnRleC1NMyBOVklDLg0KICAgIFRoZSBNU1NfU1BJX2luaXQoKSBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIE1TUyBTUEkgZHJpdmVyDQogICAgZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQuDQoNCiAgQ29uZmlndXJhdGlvbg0KICAgIEEgTVNTIFNQSSBibG9jayBjYW4gb3BlcmF0ZSBlaXRoZXIgYXMgYSBtYXN0ZXIgb3Igc2xhdmUgU1BJIGRldmljZS4gVGhlcmUNCiAgICBhcmUgdHdvIGRpc3RpbmN0IGZ1bmN0aW9ucyBmb3IgY29uZmlndXJpbmcgYSBNU1MgU1BJIGJsb2NrIGZvciBtYXN0ZXIgb3INCiAgICBzbGF2ZSBvcGVyYXRpb25zLg0KDQogICAgTWFzdGVyIGNvbmZpZ3VyYXRpb24NCiAgICBUaGUgTVNTX1NQSV9jb25maWd1cmVfbWFzdGVyX21vZGUoKSBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBzcGVjaWZpZWQgTVNTDQogICAgU1BJIGJsb2NrIGZvciBvcGVyYXRpb25zIGFzIGEgU1BJIG1hc3Rlci4gSXQgbXVzdCBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaA0KICAgIHJlbW90ZSBTUEkgc2xhdmUgZGV2aWNlIHRoZSBNU1MgU1BJIGJsb2NrIHdpbGwgY29tbXVuaWNhdGUgd2l0aC4gSXQgaXMgdXNlZA0KICAgIHRvIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIFNQSSBzbGF2ZZJzIGNvbW11bmljYXRpb24NCiAgICBjaGFyYWN0ZXJpc3RpY3M6DQogICAgICAgIJUgVGhlIFNQSSBwcm90b2NvbCBtb2RlDQogICAgICAgIJUgVGhlIFNQSSBjbG9jayBzcGVlZA0KICAgICAgICCVIFRoZSBmcmFtZSBiaXQgbGVuZ3RoDQogICAgVGhpcyBpbmZvcm1hdGlvbiBpcyBoZWxkIGJ5IHRoZSBkcml2ZXIgYW5kIHdpbGwgYmUgdXNlZCB0byBhbHRlciB0aGUNCiAgICBjb25maWd1cmF0aW9uIG9mIHRoZSBNU1MgU1BJIGJsb2NrIGVhY2ggdGltZSBhIHNsYXZlIGlzIHNlbGVjdGVkIHRocm91Z2ggYQ0KICAgIGNhbGwgdG8gTVNTX1NQSV9zZXRfc2xhdmVfc2VsZWN0KCkuIFRoZSBTUEkgcHJvdG9jb2wgbW9kZSBkZWZpbmVzIHRoZQ0KICAgIGluaXRpYWwgc3RhdGUgb2YgdGhlIGNsb2NrIHNpZ25hbCBhdCB0aGUgc3RhcnQgb2YgYSB0cmFuc2FjdGlvbiBhbmQgd2hpY2gNCiAgICBjbG9jayBlZGdlIHdpbGwgYmUgdXNlZCB0byBzYW1wbGUgdGhlIGRhdGEgc2lnbmFsLCBvciBpdCBkZWZpbmVzIHdoZXRoZXIgdGhlDQogICAgU1BJIGJsb2NrIHdpbGwgb3BlcmF0ZSBpbiBUSSBzeW5jaHJvbm91cyBzZXJpYWwgbW9kZSBvciBpbiBOU0MgTUlDUk9XSVJFIG1vZGUuDQoNCiAgICBTbGF2ZSBjb25maWd1cmF0aW9uDQogICAgVGhlIE1TU19TUElfY29uZmlndXJlX3NsYXZlX21vZGUoKSBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBzcGVjaWZpZWQgTVNTIFNQSQ0KICAgIGJsb2NrIGZvciBvcGVyYXRpb25zIGFzIGEgU1BJIHNsYXZlLiBJdCBjb25maWd1cmVzIHRoZSBmb2xsb3dpbmcgU1BJDQogICAgY29tbXVuaWNhdGlvbiBjaGFyYWN0ZXJpc3RpY3M6DQogICAgICAgIJUgVGhlIFNQSSBwcm90b2NvbCBtb2RlIA0KICAgICAgICCVIFRoZSBTUEkgY2xvY2sgc3BlZWQNCiAgICAgICAglSBUaGUgZnJhbWUgYml0IGxlbmd0aA0KICAgIFRoZSBTUEkgcHJvdG9jb2wgbW9kZSBkZWZpbmVzIHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBjbG9jayBzaWduYWwgYXQgdGhlDQogICAgc3RhcnQgb2YgYSB0cmFuc2FjdGlvbiBhbmQgd2hpY2ggY2xvY2sgZWRnZSB3aWxsIGJlIHVzZWQgdG8gc2FtcGxlIHRoZSBkYXRhDQogICAgc2lnbmFsLCBvciBpdCBkZWZpbmVzIHdoZXRoZXIgdGhlIFNQSSBibG9jayB3aWxsIG9wZXJhdGUgaW4gVEkgc3luY2hyb25vdXMNCiAgICBzZXJpYWwgbW9kZSBvciBpbiBOU0MgTUlDUk9XSVJFIG1vZGUuDQoNCiAgU1BJIG1hc3RlciBmcmFtZSB0cmFuc2ZlciBjb250cm9sDQogICAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHVzZWQgYXMgcGFydCBvZiBTUEkgbWFzdGVyIGZyYW1lIHRyYW5zZmVyczoNCiAgICAgICAglSBNU1NfU1BJX3NldF9zbGF2ZV9zZWxlY3QoKQ0KICAgICAgICCVIE1TU19TUElfdHJhbnNmZXJfZnJhbWUoKQ0KICAgICAgICCVIE1TU19TUElfY2xlYXJfc2xhdmVfc2VsZWN0KCkNCiAgICBUaGUgbWFzdGVyIG11c3QgZmlyc3Qgc2VsZWN0IHRoZSB0YXJnZXQgc2xhdmUgdGhyb3VnaCBhIGNhbGwgdG8NCiAgICBNU1NfU1BJX3NldF9zbGF2ZV9zZWxlY3QoKS4gVGhpcyBjYXVzZXMgdGhlIHJlbGV2YW50IHNsYXZlIHNlbGVjdCBsaW5lIHRvDQogICAgYmVjb21lIGFzc2VydGVkIHdoaWxlIGRhdGEgaXMgY2xvY2tlZCBvdXQgb250byB0aGUgU1BJIGRhdGEgbGluZS4NCiAgICBBIGNhbGwgdG8gaXMgdGhlbiBtYWRlIHRvIGZ1bmN0aW9uIE1TU19TUElfdHJhbnNmZXJfZnJhbWUoKSBzcGVjaWZ5aW5nIGFuZA0KICAgIHRoZSB2YWx1ZSBvZiB0aGUgZGF0YSBmcmFtZSB0byBiZSBzZW50Lg0KICAgIFRoZSBmdW5jdGlvbiBNU1NfU1BJX2NsZWFyX3NsYXZlX3NlbGVjdCgpIGNhbiBiZSB1c2VkIGFmdGVyIHRoZSB0cmFuc2ZlciBpcw0KICAgIGNvbXBsZXRlIHRvIHByZXZlbnQgdGhpcyBzbGF2ZSBzZWxlY3QgbGluZSBmcm9tIGJlaW5nIGFzc2VydGVkIGR1cmluZw0KICAgIHN1YnNlcXVlbnQgU1BJIHRyYW5zYWN0aW9ucy4gQSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gaXMgb25seSByZXF1aXJlZCBpZiB0aGUNCiAgICBtYXN0ZXIgaXMgY29tbXVuaWNhdGluZyB3aXRoIG11bHRpcGxlIHNsYXZlIGRldmljZXMuDQoNCiAgU1BJIG1hc3RlciBibG9jayB0cmFuc2ZlciBjb250cm9sDQogICAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHVzZWQgYXMgcGFydCBvZiBTUEkgbWFzdGVyIGJsb2NrIHRyYW5zZmVyczoNCiAgICAgICAglSBNU1NfU1BJX3NldF9zbGF2ZV9zZWxlY3QoKQ0KICAgICAgICCVIE1TU19TUElfY2xlYXJfc2xhdmVfc2VsZWN0KCkNCiAgICAgICAglSBNU1NfU1BJX3RyYW5zZmVyX2Jsb2NrKCkNCiAgICBUaGUgbWFzdGVyIG11c3QgZmlyc3Qgc2VsZWN0IHRoZSB0YXJnZXQgc2xhdmUgdGhyb3VnaCBhIGNhbGwgdG8NCiAgICBNU1NfU1BJX3NldF9zbGF2ZV9zZWxlY3QoKS4gVGhpcyBjYXVzZXMgdGhlIHJlbGV2YW50IHNsYXZlIHNlbGVjdCBsaW5lIHRvDQogICAgYmVjb21lIGFzc2VydGVkIHdoaWxlIGRhdGEgaXMgY2xvY2tlZCBvdXQgb250byB0aGUgU1BJIGRhdGEgbGluZS4NCiAgICBBbHRlcm5hdGl2ZWx5IGEgR1BJTyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSBzdGF0ZSBvZiB0aGUgdGFyZ2V0IHNsYXZlDQogICAgZGV2aWNlknMgY2hpcCBzZWxlY3Qgc2lnbmFsLg0KICAgIEEgY2FsbCB0byBpcyB0aGVuIG1hZGUgdG8gZnVuY3Rpb24gTVNTX1NQSV90cmFuc2Zlcl9ibG9jayAoKS4gVGhlDQogICAgcGFyYW1ldGVycyBvZiB0aGlzIGZ1bmN0aW9uIHNwZWNpZnk6DQogICAgICAgIJUgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSB0cmFuc21pdHRlZA0KICAgICAgICCVIGEgcG9pbnRlciB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gYmUgdHJhbnNtaXR0ZWQNCiAgICAgICAglSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHJlY2VpdmVkDQogICAgICAgIJUgYSBwb2ludGVyIHRvIHRoZSBidWZmZXIgd2hlcmUgcmVjZWl2ZWQgZGF0YSB3aWxsIGJlIHN0b3JlZA0KICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgdHJhbnNtaXR0ZWQgY2FuIGJlIHNldCB0byB6ZXJvIHRvIGluZGljYXRlIHRoYXQNCiAgICB0aGUgdHJhbnNmZXIgaXMgcHVyZWx5IGEgYmxvY2sgcmVhZCB0cmFuc2Zlci4gVGhlIG51bWJlciBvZiBieXRlcyB0byBiZQ0KICAgIHJlY2VpdmVkIGNhbiBiZSBzZXQgdG8gemVybyB0byBzcGVjaWZ5IHRoYXQgdGhlIHRyYW5zZmVyIGlzIHB1cmVseSBhIGJsb2NrDQogICAgd3JpdGUgdHJhbnNmZXIuDQogICAgVGhlIGZ1bmN0aW9uIE1TU19TUElfY2xlYXJfc2xhdmVfc2VsZWN0KCkgY2FuIGJlIHVzZWQgYWZ0ZXIgdGhlIHRyYW5zZmVyIGlzDQogICAgY29tcGxldGUgdG8gcHJldmVudCB0aGlzIHNsYXZlIHNlbGVjdCBsaW5lIGZyb20gYmVpbmcgYXNzZXJ0ZWQgZHVyaW5nDQogICAgc3Vic2VxdWVudCBTUEkgdHJhbnNhY3Rpb25zLiBBIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiBpcyBvbmx5IHJlcXVpcmVkIGlmIHRoZQ0KICAgIG1hc3RlciBpcyBjb21tdW5pY2F0aW5nIHdpdGggbXVsdGlwbGUgc2xhdmUgZGV2aWNlcy4NCiANCiAgU1BJIHNsYXZlIGZyYW1lIHRyYW5zZmVyIGNvbnRyb2wNCiAgICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgdXNlZCBhcyBwYXJ0IG9mIFNQSSBzbGF2ZSBmcmFtZSB0cmFuc2ZlcnM6DQogICAgICAgIJUgTVNTX1NQSV9zZXRfc2xhdmVfdHhfZnJhbWUoKQ0KICAgICAgICCVIE1TU19TUElfc2V0X2ZyYW1lX3J4X2hhbmRsZXIoKQ0KICAgIFRoZSBNU1NfU1BJX3NldF9zbGF2ZV90eF9mcmFtZSgpIGZ1bmN0aW9uIHNwZWNpZmllcyB0aGUgZnJhbWUgZGF0YSB0aGF0IHdpbGwNCiAgICBiZSByZXR1cm5lZCB0byB0aGUgU1BJIG1hc3Rlci4gVGhlIGZyYW1lIGRhdGEgc3BlY2lmaWVkIHRocm91Z2ggdGhpcw0KICAgIGZ1bmN0aW9uIGlzIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgcmVhZCBvdmVyIHRoZSBTUEkgYnVzIGJ5IHRoZSByZW1vdGUgU1BJDQogICAgbWFzdGVyIHdoZW4gaXQgaW5pdGlhdGVzIGEgdHJhbnNhY3Rpb24uIEEgY2FsbCB0byBNU1NfU1BJX3NldF9zbGF2ZV90eF9mcmFtZSgpDQogICAgaXMgb25seSByZXF1aXJlZCBpZiB0aGUgTVNTIFNQSSBzbGF2ZSBpcyB0aGUgdGFyZ2V0IG9mIFNQSSAgcmVhZCB0cmFuc2FjdGlvbnMsDQogICAgaS5lLiBpZiBkYXRhIGlzIG1lYW50IHRvIGJlIHJlYWQgZnJvbSB0aGUgU21hcnRGdXNpb24gZGV2aWNlIG92ZXIgU1BJLg0KICAgIFRoZSBNU1NfU1BJX3NldF9mcmFtZV9yeF9oYW5kbGVyKCkgZnVuY3Rpb24gc3BlY2lmaWVzIHRoZSByZWNlaXZlIGhhbmRsZXINCiAgICBmdW5jdGlvbiB0aGF0IHdpbGwgY2FsbGVkIHdoZW4gYSBmcmFtZSBvZiBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IHRoZSBNU1MNCiAgICBTUEkgd2hlbiBpdCBpcyBjb25maWd1cmVkIGFzIGEgc2xhdmUuIFRoZSByZWNlaXZlIGhhbmRsZXIgZnVuY3Rpb24gc3BlY2lmaWVkDQogICAgdGhyb3VnaCB0aGlzIGNhbGwgd2lsbCBwcm9jZXNzIHRoZSBmcmFtZSBkYXRhIHdyaXR0ZW4sIG92ZXIgdGhlIFNQSSBidXMsIHRvDQogICAgdGhlIE1TUyBTUEkgc2xhdmUgYnkgdGhlIHJlbW90ZSBTUEkgbWFzdGVyLiBUaGUgcmVjZWl2ZSBoYW5kbGVyIGZ1bmN0aW9uIG11c3QNCiAgICBiZSBpbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbi4gSXQgaXMgb25seSByZXF1aXJlZCBpZiB0aGUgTVNTIFNQSQ0KICAgIHNsYXZlIGlzIHRoZSB0YXJnZXQgb2YgU1BJIGZyYW1lIHdyaXRlIHRyYW5zYWN0aW9ucy4NCg0KICBTUEkgc2xhdmUgYmxvY2sgdHJhbnNmZXIgY29udHJvbA0KICAgIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB1c2VkIGFzIHBhcnQgb2YgU1BJIHNsYXZlIGJsb2NrIHRyYW5zZmVyczoNCiAgICAgICAglSBNU1NfU1BJX3NldF9zbGF2ZV9ibG9ja19idWZmZXJzKCkNCiAgICBUaGUgTVNTX1NQSV9zZXRfc2xhdmVfYmxvY2tfYnVmZmVycygpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY29uZmlndXJlIGEgTVNTIFNQSQ0KICAgIHNsYXZlIGZvciBibG9jayB0cmFuc2ZlciBvcGVyYXRpb25zLiBJdCBzcGVjaWZpZXM6DQogICAgICAgIJUgVGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB0byB0aGUgcmVtb3RlIFNQSSBtYXN0ZXINCiAgICAgICAglSBUaGUgYnVmZmVyIHdoZXJlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgcmVtb3RlIFNQSSBtYXN0ZXIgd2lsbCBiZSBzdG9yZWQNCiAgICAgICAglSBUaGUgaGFuZGxlciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSByZWNlaXZlIGJ1ZmZlciBpcyBmaWxsZWQNCg0KICBETUEgYmxvY2sgdHJhbnNmZXIgY29udHJvbA0KICAgIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB1c2VkIGFzIHBhcnQgb2YgTVNTIFNQSSBETUEgdHJhbnNmZXJzOg0KICAgICAgICCVIE1TU19TUElfZGlzYWJsZSgpDQogICAgICAgIJUgTVNTX1NQSV9zZXRfdHJhbnNmZXJfYnl0ZV9jb3VudCgpDQogICAgICAgIJUgTVNTX1NQSV9lbmFibGUoKQ0KICAgICAgICCVIE1TU19TUElfdHhfZG9uZSgpDQogICAgVGhlIE1TUyBTUEkgbXVzdCBmaXJzdCBiZSBkaXNhYmxlZCB0aHJvdWdoIGEgY2FsbCB0byBmdW5jdGlvbiBNU1NfU1BJX2Rpc2FibGUoKS4NCiAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHRyYW5zZmVycmVkIGlzIHRoZW4gc2V0IHRocm91Z2ggYSBjYWxsIHRvIGZ1bmN0aW9uDQogICAgTVNTX1NQSV9zZXRfdHJhbnNmZXJfYnl0ZV9jb3VudCgpLiBUaGUgRE1BIHRyYW5zZmVyIGlzIHRoZW4gaW5pdGlhdGVkIGJ5IGEgY2FsbA0KICAgIHRvIHRoZSBNU1NfUERNQV9zdGFydCgpIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IHRoZSBNU1MgUERNQSBkcml2ZXIuIFRoZSBhY3R1YWwNCiAgICBETUEgdHJhbnNmZXIgd2lsbCBvbmx5IHN0YXJ0IG9uY2UgdGhlIE1TUyBTUEkgYmxvY2sgaGFzIGJlZW4gcmUtZW5hYmxlZCB0aHJvdWdoDQogICAgYSBjYWxsIHRvICBNU1NfU1BJX2VuYWJsZSgpLiBUaGUgY29tcGxldGlvbiBvZiB0aGUgRE1BIGRyaXZlbiBTUEkgdHJhbnNmZXIgY2FuDQogICAgYmUgZGV0ZWN0ZWQgdGhyb3VnaCBhIGNhbGwgdG8gTVNTX1NQSV90eF9kb25lKCkuIFRoZSBkaXJlY3Rpb24gb2YgdGhlIFNQSQ0KICAgIHRyYW5zZmVyLCB3cml0ZSBvciByZWFkLCBkZXBlbmRzIG9uIHRoZSBETUEgY2hhbm5lbCBjb25maWd1cmF0aW9uLiBBIFNQSSB3cml0ZQ0KICAgIHRyYW5zZmVyIG9jY3VycyB3aGVuIHRoZSBETUEgY2hhbm5lbCBpcyBjb25maWd1cmVkIHRvIHdyaXRlIGRhdGEgdG8gdGhlIE1TUyBTUEkNCiAgICBibG9jay4gQSBTUEkgcmVhZCB0cmFuc2ZlciBvY2N1cnMgd2hlbiB0aGUgRE1BIGNoYW5uZWwgaXMgY29uZmlndXJlZCB0byByZWFkIGRhdGENCiAgICBmcm9tIHRoZSBNU1MgU1BJIGJsb2NrLg0KDQogKi8vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KI2lmbmRlZiBNU1NfU1BJX0hfDQojZGVmaW5lIE1TU19TUElfSF8NCg0KI2luY2x1ZGUgIi4uLy4uL0NNU0lTL2EyZnh4eG0zLmgiDQoNCiNpZmRlZiBfX2NwbHVzcGx1cw0KZXh0ZXJuICJDIiB7DQojZW5kaWYgDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoaXMgZGVmaW5lcyB0aGUgZnVuY3Rpb24gcHJvdG90eXBlIHRoYXQgbXVzdCBiZSBmb2xsb3dlZCBieSBNU1MgU1BJIHNsYXZlDQogIGZyYW1lIHJlY2VpdmUgaGFuZGxlciBmdW5jdGlvbnMuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBNU1MNCiAgU1BJIGRyaXZlciB0aHJvdWdoIHRoZSBNU1NfU1BJX3NldF9mcmFtZV9yeF9oYW5kbGVyICgpIGZ1bmN0aW9uLg0KICANCiAgRGVjbGFyaW5nIGFuZCBJbXBsZW1lbnRpbmcgU2xhdmUgRnJhbWUgUmVjZWl2ZSBIYW5kbGVyIEZ1bmN0aW9uczoNCiAgICBTbGF2ZSBmcmFtZSByZWNlaXZlIGhhbmRsZXIgZnVuY3Rpb25zIHNob3VsZCBmb2xsb3cgdGhlIGZvbGxvd2luZyBwcm90b3R5cGU6DQogICAgICAgIHZvaWQgc2xhdmVfZnJhbWVfcmVjZWl2ZV9oYW5kbGVyICggdWludDMyX3QgcnhfZnJhbWUgKTsNCiAgICBUaGUgYWN0dWFsIG5hbWUgb2YgdGhlIHJlY2VpdmUgaGFuZGxlciBpcyB1bmltcG9ydGFudC4gWW91IGNhbiB1c2UgYW55IG5hbWUNCiAgICBvZiB5b3VyIGNob2ljZSBmb3IgdGhlIHJlY2VpdmUgZnJhbWUgaGFuZGxlci4gVGhlIHJ4X2ZyYW1lIHBhcmFtZXRlciB3aWxsDQogICAgY29udGFpbiB0aGUgdmFsdWUgb2YgdGhlIHJlY2VpdmVkIGZyYW1lLg0KICovDQp0eXBlZGVmIHZvaWQgKCptc3Nfc3BpX2ZyYW1lX3J4X2hhbmRsZXJfdCkoIHVpbnQzMl90IHJ4X2ZyYW1lICk7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoaXMgZGVmaW5lcyB0aGUgZnVuY3Rpb24gcHJvdG90eXBlIHRoYXQgbXVzdCBiZSBmb2xsb3dlZCBieSBNU1MgU1BJIHNsYXZlDQogIGJsb2NrIHJlY2VpdmUgaGFuZGxlciBmdW5jdGlvbnMuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBNU1MNCiAgU1BJIGRyaXZlciB0aHJvdWdoIHRoZSBNU1NfU1BJX3NldF9zbGF2ZV9ibG9ja19idWZmZXJzKCkgZnVuY3Rpb24uDQogIA0KICBEZWNsYXJpbmcgYW5kIEltcGxlbWVudGluZyBTbGF2ZSBCbG9jayBSZWNlaXZlIEhhbmRsZXIgRnVuY3Rpb25zDQogICAgU2xhdmUgYmxvY2sgcmVjZWl2ZSBoYW5kbGVyIGZ1bmN0aW9ucyBzaG91bGQgZm9sbG93IHRoZSBmb2xsb3dpbmcgcHJvdG90eXBlOg0KICAgICAgICB2b2lkIG1zc19zcGlfYmxvY2tfcnhfaGFuZGxlciAoIHVpbnQ4X3QgKiByeF9idWZmLCB1aW50MTZfdCByeF9zaXplICk7DQogICAgVGhlIGFjdHVhbCBuYW1lIG9mIHRoZSByZWNlaXZlIGhhbmRsZXIgaXMgdW5pbXBvcnRhbnQuIFlvdSBjYW4gdXNlIGFueSBuYW1lDQogICAgb2YgeW91ciBjaG9pY2UgZm9yIHRoZSByZWNlaXZlIGZyYW1lIGhhbmRsZXIuIFRoZSByeF9idWZmIHBhcmFtZXRlciB3aWxsDQogICAgY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSByZWNlaXZlZCBibG9jay4gVGhlIHJ4X3NpemUgcGFyYW1ldGVyDQogICAgd2lsbCBjb250YWluIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgdGhlIHJlY2VpdmVkIGJsb2NrLg0KDQogKi8NCnR5cGVkZWYgdm9pZCAoKm1zc19zcGlfYmxvY2tfcnhfaGFuZGxlcl90KSggdWludDhfdCAqIHJ4X2J1ZmYsIHVpbnQzMl90IHJ4X3NpemUgKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhpcyBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIGRlZmluZSB0aGUgc2V0dGluZ3MgZm9yIHRoZSBTUEkgcHJvdG9jb2wgbW9kZQ0KICBiaXRzLCBDUEhBIGFuZCBDUE9MLiBJdCBpcyB1c2VkIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBNU1NfU1BJX2NvbmZpZ3VyZV9tYXN0ZXJfbW9kZSgpDQogIGFuZCBNU1NfU1BJX2NvbmZpZ3VyZV9zbGF2ZV9tb2RlKCkgZnVuY3Rpb25zLg0KICANCiAgLSBNU1NfU1BJX01PREUwOg0KICAgICAgICBDbG9jayBzdGFydHMgbG93LCBkYXRhIHJlYWQgb24gY2xvY2sncyByaXNpbmcgZWRnZSwgZGF0YSBjaGFuZ2VzIG9uDQogICAgICAgIGZhbGxpbmcgZWRnZS4NCiAgICAgICAgDQogIC0gTVNTX1NQSV9NT0RFMToNCiAgICAgICAgQ2xvY2sgc3RhcnRzIGxvdywgZGF0YSByZWFkIG9uIGNsb2NrJ3MgZmFsbGluZyBlZGdlLCBkYXRhIGNoYW5nZXMgb24NCiAgICAgICAgcmlzaW5nIGVkZ2UuDQogICAgICAgIA0KICAtIE1TU19TUElfTU9ERTI6DQogICAgICAgIENsb2NrIHN0YXJ0cyBoaWdoLCBkYXRhIHJlYWQgb24gY2xvY2sncyBmYWxsaW5nIGVkZ2UsIGRhdGEgY2hhbmdlcyBvbg0KICAgICAgICByaXNpbmcgZWRnZS4NCiAgICAgICAgDQogIC0gTVNTX1NQSV9NT0RFMzoNCiAgICAgICAgQ2xvY2sgc3RhcnRzIGhpZ2gsIGRhdGEgcmVhZCBvbiBjbG9jaydzIHJpc2luZyBlZGdlLCBkYXRhIGNoYW5nZXMgb24NCiAgICAgICAgZmFsbGluZyBlZGdlLg0KICAgICAgICANCiAgLSBNU1NfVElfTU9ERTogIA0KICAgICAgICBUSSBzeW5jcm9ub3VzIHNlcmlhbCBtb2RlLiBTbGF2ZSBzZWxlY3QgaXMgcHVsc2VkIGF0IHN0YXJ0IG9mIHRyYW5zZmVyLg0KICAgICAgICANCiAgLSBNU1NfTlNDX01PREU6DQogICAgICAgIE5TQyBNaWNyb3dpcmUgbW9kZS4NCiAqLw0KdHlwZWRlZiBlbnVtIF9fbXNzX3NwaV9wcm90b2NvbF9tb2RlX3QNCnsNCiAgICBNU1NfU1BJX01PREUwICAgID0gMHgwMDAwMDAwMCwNCiAgICBNU1NfU1BJX1RJX01PREUgID0gMHgwMDAwMDAwNCwNCiAgICBNU1NfU1BJX05TQ19NT0RFID0gMHgwMDAwMDAwOCwNCiAgICBNU1NfU1BJX01PREUyICAgID0gMHgwMTAwMDAwMCwNCiAgICBNU1NfU1BJX01PREUxICAgID0gMHgwMjAwMDAwMCwNCiAgICBNU1NfU1BJX01PREUzICAgID0gMHgwMzAwMDAwMA0KfSBtc3Nfc3BpX3Byb3RvY29sX21vZGVfdDsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiBUaGlzIGVudW1lcmF0aW9uIHNwZWNpZmllcyB0aGUgZGl2aWRlciB0byBiZSBhcHBsaWVkIHRvIHRoZSB0aGUgQVBCIGJ1cyBjbG9jaw0KIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBTUEkgY2xvY2suIEl0IGlzIHVzZWQgYXMgcGFyYW1ldGVyIHRvIHRoZQ0KIE1TU19TUElfY29uZmlndXJlX21hc3Rlcl9tb2RlKCkgYW5kIE1TU19TUElfY29uZmlndXJlX3NsYXZlX21vZGUoKWZ1bmN0aW9ucy4NCiAqLw0KIHR5cGVkZWYgZW51bSBfX21zc19zcGlfcGNsa19kaXZfdA0KIHsNCglNU1NfU1BJX1BDTEtfRElWXzIJCT0gMCwNCglNU1NfU1BJX1BDTEtfRElWXzQJCT0gMSwNCglNU1NfU1BJX1BDTEtfRElWXzgJCT0gMiwNCglNU1NfU1BJX1BDTEtfRElWXzE2CQk9IDMsDQoJTVNTX1NQSV9QQ0xLX0RJVl8zMgkJPSA0LA0KCU1TU19TUElfUENMS19ESVZfNjQJCT0gNSwNCglNU1NfU1BJX1BDTEtfRElWXzEyOAk9IDYsDQoJTVNTX1NQSV9QQ0xLX0RJVl8yNTYJPSA3DQp9IG1zc19zcGlfcGNsa19kaXZfdDsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiBUaGlzIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gc2VsZWN0IGEgc3BlY2lmaWMgU1BJIHNsYXZlIGRldmljZSAoMCB0byA3KS4gSXQgaXMNCiB1c2VkIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBNU1NfU1BJX2NvbmZpZ3VyZV9tYXN0ZXJfbW9kZSgpLA0KIE1TU19TUElfc2V0X3NsYXZlX3NlbGVjdCgpIGFuZCBNU1NfU1BJX2NsZWFyX3NsYXZlX3NlbGVjdCAoKSBmdW5jdGlvbnMuDQogKi8NCiB0eXBlZGVmIGVudW0gX19tc3Nfc3BpX3NsYXZlX3QNCiB7DQoJTVNTX1NQSV9TTEFWRV8wCQk9IDAsDQoJTVNTX1NQSV9TTEFWRV8xCQk9IDEsDQoJTVNTX1NQSV9TTEFWRV8yCQk9IDIsDQoJTVNTX1NQSV9TTEFWRV8zCQk9IDMsDQoJTVNTX1NQSV9TTEFWRV80CQk9IDQsDQoJTVNTX1NQSV9TTEFWRV81CQk9IDUsDQoJTVNTX1NQSV9TTEFWRV82CQk9IDYsDQoJTVNTX1NQSV9TTEFWRV83CQk9IDcsDQogICAgTVNTX1NQSV9NQVhfTkJfT0ZfU0xBVkVTID0gOA0KfSBtc3Nfc3BpX3NsYXZlX3Q7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoaXMgY29uc3RhbnQgZGVmaW5lcyBhIGZyYW1lIHNpemUgb2YgOCBiaXRzIHdoZW4gY29uZmlndXJpbmcgYW4gTVNTIFNQSSB0bw0KICBwZXJmb3JtIGJsb2NrIHRyYW5zZmVyIGRhdGEgdHJhbnNhY3Rpb25zLg0KICBJdCBtdXN0IGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciB0aGUgZnJhbWVfYml0X2xlbmd0aCBwYXJhbWV0ZXIgb2YgZnVuY3Rpb24NCiAgTVNTX1NQSV9jb25maWd1cmVfbWFzdGVyX21vZGUoKSB3aGVuIHBlcmZvcm1pbmcgYmxvY2sgdHJhbnNmZXJzIGJldHdlZW4gdGhlDQogIE1TUyBTUEkgbWFzdGVyIGFuZCB0aGUgdGFyZ2V0IFNQSSBzbGF2ZS4NCiAgSXQgbXVzdCBhbHNvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciB0aGUgZnJhbWVfYml0X2xlbmd0aCBwYXJhbWV0ZXIgb2YNCiAgZnVuY3Rpb24gTVNTX1NQSV9jb25maWd1cmVfc2xhdmVfbW9kZSgpIHdoZW4gcGVyZm9ybWluZyBibG9jayB0cmFuc2ZlcnMNCiAgYmV0d2VlbiB0aGUgTVNTIFNQSSBzbGF2ZSBhbmQgdGhlIHJlbW90ZSBTUEkgbWFzdGVyLg0KICovDQojZGVmaW5lIE1TU19TUElfQkxPQ0tfVFJBTlNGRVJfRlJBTUVfU0laRSAgIDgNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIG1zc19zcGlfc2xhdmVfY2ZnX3QgaG9sZHMgdGhlIE1TUyBTUEkgY29uZmlndXJhdGlvbiB0aGF0IG11c3QgYmUgdXNlZCB0bw0KICBjb21tdW5pY2F0ZSB3aXRoIGEgc3BlY2lmaWMgU1BJIHNsYXZlLg0KICovDQp0eXBlZGVmIHN0cnVjdCBfX21zc19zcGlfc2xhdmVfY2ZnX3QNCnsNCiAgICB1aW50MzJfdCBjdHJsX3JlZzsNCiAgICB1aW50OF90IHR4cnhkZl9zaXplX3JlZzsNCiAgICB1aW50OF90IGNsa19nZW47DQp9IG1zc19zcGlfc2xhdmVfY2ZnX3Q7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZXJlIGlzIG9uZSBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZSBmb3IgZWFjaCBvZiB0aGUgbWljcm9jb250cm9sbGVyDQogIHN1YnN5c3RlbSdzIFNQSXMuIEluc3RhbmNlcyBvZiB0aGlzIHN0cnVjdHVyZSBhcmUgdXNlZCB0byBpZGVudGlmeSBhIHNwZWNpZmljDQogIFNQSS4gQSBwb2ludGVyIHRvIGFuIGluc3RhbmNlIG9mIHRoZSBtc3Nfc3BpX2luc3RhbmNlX3Qgc3RydWN0dXJlIGlzIHBhc3NlZCBhcw0KICB0aGUgZmlyc3QgcGFyYW1ldGVyIHRvIE1TUyBTUEkgZHJpdmVyIGZ1bmN0aW9ucyB0byBpZGVudGlmeSB3aGljaCBTUEkgc2hvdWxkDQogIHBlcmZvcm0gdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24uDQogKi8NCnR5cGVkZWYgc3RydWN0IF9fbXNzX3NwaV9pbnN0YW5jZV90DQp7DQogICAgLyogQ01TSVMgcmVsYXRlZCBkZWZpbmVzIGlkZW50aWZ5aW5nIHRoZSBTUEkgaGFyZHdhcmUuICovDQogICAgU1BJX1R5cGVEZWYgKiAgICAgICAgICBod19yZWc7ICAgICAvKiE8IFBvaW50ZXIgdG8gU1BJIHJlZ2lzdGVycy4gKi8NCiAgICBTUElfQml0QmFuZF9UeXBlRGVmICogIGh3X3JlZ19iaXQ7IC8qITwgUG9pbnRlciB0byBTUEkgcmVnaXN0ZXJzIGJpdCBiYW5kIGFyZWEuICovDQogICAgSVJRbl9UeXBlICAgICAgICAgICAgICAgaXJxbjsgICAgICAgLyohPCBTUEkncyBDb3J0ZXgtTTMgTlZJQyBpbnRlcnJ1cHQgbnVtYmVyLiAqLw0KICAgIA0KCS8qIEludGVybmFsIHRyYW5zbWl0IHN0YXRlOiAqLw0KCWNvbnN0IHVpbnQ4X3QgKiBzbGF2ZV90eF9idWZmZXI7ICAgIC8qITwgUG9pbnRlciB0byBzbGF2ZSB0cmFuc21pdCBidWZmZXIuICovDQoJdWludDMyX3Qgc2xhdmVfdHhfc2l6ZTsgICAgICAgICAgICAgLyohPCBTaXplIG9mIHNsYXZlIHRyYW5zbWl0IGJ1ZmZlci4gKi8NCgl1aW50MzJfdCBzbGF2ZV90eF9pZHg7ICAgICAgICAgICAgICAvKiE8IEN1cnJlbnQgaW5kZXggaW50byBzbGF2ZSB0cmFuc21pdCBidWZmZXIuICovDQoJDQoJLyogSW50ZXJuYWwgcmVjZWl2ZSBzdGF0ZTogKi8NCgl1aW50OF90ICogc2xhdmVfcnhfYnVmZmVyOyAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gYnVmZmVyIHdoZXJlIGRhdGEgcmVjZWl2ZWQgYnkgYSBzbGF2ZSB3aWxsIGJlIHN0b3JlZC4gKi8NCgl1aW50MzJfdCBzbGF2ZV9yeF9zaXplOyAgICAgICAgICAgICAvKiE8IFNsYXZlIHJlY2VpdmUgYnVmZmVyIHNpemUuICovDQoJdWludDMyX3Qgc2xhdmVfcnhfaWR4OyAgICAgICAgICAgICAgLyohPCBDdXJyZW50IGluZGV4IGludG8gc2xhdmUgcmVjZWl2ZSBidWZmZXIuICovDQogICAgDQogICAgLyogQ29uZmlndXJhdGlvbiBmb3IgZWFjaCB0YXJnZXQgc2xhdmUuICovDQogICAgbXNzX3NwaV9zbGF2ZV9jZmdfdCBzbGF2ZXNfY2ZnW01TU19TUElfTUFYX05CX09GX1NMQVZFU107DQogICAgDQogICAgLyoqIFNsYXZlIHJlY2VpdmVkIGZyYW1lIGhhbmRsZXI6ICovDQogICAgbXNzX3NwaV9mcmFtZV9yeF9oYW5kbGVyX3QgZnJhbWVfcnhfaGFuZGxlcjsgICAgLyohPCBQb2ludGVyIHRvIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBhIGZyYW1lIGlzIHJlY2VpdmVkIHdoZW4gdGhlIFNQSSBibG9jayBpcyBjb25maWd1cmVkIGFzIHNsYXZlLiAqLw0KICAgIA0KICAgIHVpbnQzMl90IHNsYXZlX3R4X2ZyYW1lOyAgICAgICAgICAgICAgICAvKiE8IFZhbHVlIG9mIHRoZSBkYXRhIGZyYW1lIHRoYXQgd2lsbCBiZSB0cmFuc21pdGVkIHdoZW4gdGhlIFNQSSBibG9jayBpcyBjb25maWd1cmVkIGFzIHNsYXZlLiAqLw0KICAgIA0KICAgIC8qIFNsYXZlIGJsb2NrIHJ4IGhhbmRsZXI6ICovDQogICAgbXNzX3NwaV9ibG9ja19yeF9oYW5kbGVyX3QgYmxvY2tfcnhfaGFuZGxlcjsgICAgLyohPCBQb2ludGVyIHRvIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBkYXRhIGJsb2NrIGhhcyBiZWVuIHJlY2VpdmVkLiAqLw0KDQp9IG1zc19zcGlfaW5zdGFuY2VfdDsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhpcyBpbnN0YW5jZSBvZiBtc3Nfc3BpX2luc3RhbmNlX3QgaG9sZHMgYWxsIGRhdGEgcmVsYXRlZCB0byB0aGUgb3BlcmF0aW9ucw0KICBwZXJmb3JtZWQgYnkgTVNTIFNQSSAwLiBBIHBvaW50ZXIgdG8gZ19tc3Nfc3BpMCBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0DQogIHBhcmFtZXRlciB0byBNU1MgU1BJIGRyaXZlciBmdW5jdGlvbnMgdG8gaW5kaWNhdGUgdGhhdCBNU1MgU1BJIDAgc2hvdWxkDQogIHBlcmZvcm0gdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24uDQogKi8NCmV4dGVybiBtc3Nfc3BpX2luc3RhbmNlX3QgZ19tc3Nfc3BpMDsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhpcyBpbnN0YW5jZSBvZiBtc3Nfc3BpX2luc3RhbmNlX3QgaG9sZHMgYWxsIGRhdGEgcmVsYXRlZCB0byB0aGUgb3BlcmF0aW9ucw0KICBwZXJmb3JtZWQgYnkgTVNTIFNQSSAxLiBBIHBvaW50ZXIgdG8gZ19tc3Nfc3BpMSBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0DQogIHBhcmFtZXRlciB0byBNU1MgU1BJIGRyaXZlciBmdW5jdGlvbnMgdG8gaW5kaWNhdGUgdGhhdCBNU1MgU1BJIDEgc2hvdWxkDQogIHBlcmZvcm0gdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24uDQogKi8NCmV4dGVybiBtc3Nfc3BpX2luc3RhbmNlX3QgZ19tc3Nfc3BpMTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIE1TU19TUElfaW5pdCgpIGZ1bmN0aW9uIGluaXRpYWxpemVzIGFuZCBoYXJkd2FyZSBhbmQgZGF0YSBzdHJ1Y3R1cmVzIG9mDQogIG9uZSBvZiB0aGUgU21hcnRGdXNpb24gTVNTIFNQSXMuIFRoZSBNU1NfU1BJX2luaXQoKSBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZA0KICBiZWZvcmUgYW55IG90aGVyIE1TUyBTUEkgZHJpdmVyIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkLg0KICANCiAgQHBhcmFtIHRoaXNfc3BpDQogICAgVGhlIHRoaXNfc3BpIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gbXNzX3NwaV9pbnN0YW5jZV90IHN0cnVjdHVyZQ0KICAgIGlkZW50aWZ5aW5nIHRoZSBNU1MgU1BJIGhhcmR3YXJlIGJsb2NrIHRvIGJlIGluaXRpYWxpemVkLiBUaGVyZSBhcmUgdHdvIHN1Y2gNCiAgICBkYXRhIHN0cnVjdHVyZXMsIGdfbXNzX3NwaTAgYW5kIGdfbXNzX3NwaTEsIGFzc29jaWF0ZWQgd2l0aCBNU1MgU1BJIDAgYW5kDQogICAgTVNTIFNQSSAxIHJlc3BlY3RpdmVseS4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBlaXRoZXIgdGhlIGdfbXNzX3NwaTANCiAgICBvciBnX21zc19zcGkxIGdsb2JhbCBkYXRhIHN0cnVjdHVyZSBkZWZpbmVkIHdpdGhpbiB0aGUgU1BJIGRyaXZlci4NCiAgICANCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgTVNTX1NQSV9pbml0KCAmZ19tc3Nfc3BpMCApOw0KICBAZW5kY29kZQ0KICovDQp2b2lkIE1TU19TUElfaW5pdA0KKA0KCW1zc19zcGlfaW5zdGFuY2VfdCAqIHRoaXNfc3BpDQopOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGUgTVNTX1NQSV9jb25maWd1cmVfc2xhdmVfbW9kZSgpIGZ1bmN0aW9uIGNvbmZpZ3VyZSBhIE1TUyBTUEkgYmxvY2sgZm9yDQogIG9wZXJhdGlvbnMgYXMgYSBzbGF2ZSBTUEkgZGV2aWNlLiBJdCBjb25maWd1cmVzIHRoZSBTUEkgaGFyZHdhcmUgd2l0aCB0aGUNCiAgc2VsZWN0ZWQgU1BJIHByb3RvY29sIG1vZGUgYW5kIGNsb2NrIHNwZWVkLg0KICAgIA0KICBAcGFyYW0gdGhpc19zcGkNCiAgICBUaGUgdGhpc19zcGkgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBtc3Nfc3BpX2luc3RhbmNlX3Qgc3RydWN0dXJlDQogICAgaWRlbnRpZnlpbmcgdGhlIE1TUyBTUEkgaGFyZHdhcmUgYmxvY2sgdG8gYmUgaW5pdGlhbGl6ZWQuIFRoZXJlIGFyZSB0d28gc3VjaA0KICAgIGRhdGEgc3RydWN0dXJlcywgZ19tc3Nfc3BpMCBhbmQgZ19tc3Nfc3BpMSwgYXNzb2NpYXRlZCB3aXRoIE1TUyBTUEkgMCBhbmQNCiAgICBNU1MgU1BJIDEgcmVzcGVjdGl2ZWx5LiBUaGlzIHBhcmFtZXRlciBtdXN0IHBvaW50IHRvIGVpdGhlciB0aGUgZ19tc3Nfc3BpMA0KICAgIG9yIGdfbXNzX3NwaTEgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIGRlZmluZWQgd2l0aGluIHRoZSBTUEkgZHJpdmVyLg0KICAgIA0KICBAcGFyYW0gcHJvdG9jb2xfbW9kZQ0KICAgIFNlcmlhbCBwZXJpcGhlcmFsIGludGVyZmFjZSBvcGVyYXRpbmcgbW9kZS4gQWxsb3dlZCB2YWx1ZXMgYXJlOg0KICAgICAgICAtIE1TU19TUElfTU9ERTANCiAgICAgICAgLSBNU1NfU1BJX01PREUxDQogICAgICAgIC0gTVNTX1NQSV9NT0RFMg0KICAgICAgICAtIE1TU19TUElfTU9ERTMNCiAgICAgICAgLSBNU1NfVElfTU9ERQ0KICAgICAgICAtIE1TU19OU0NfTU9ERQ0KIA0KICBAcGFyYW0gY2xrX3JhdGUNCiAgICBEaXZpZGVyIHZhbHVlIHVzZWQgdG8gZ2VuZXJhdGUgc2VyaWFsIGludGVyZmFjZSBjbG9jayBzaWduYWwgZnJvbSBQQ0xLLg0KICAgIEFsbG93ZWQgdmFsdWVzIGFyZToNCiAgICAgICAgLSBNU1NfU1BJX1BDTEtfRElWXzINCiAgICAgICAgLSBNU1NfU1BJX1BDTEtfRElWXzQNCiAgICAgICAgLSBNU1NfU1BJX1BDTEtfRElWXzgNCiAgICAgICAgLSBNU1NfU1BJX1BDTEtfRElWXzE2DQogICAgICAgIC0gTVNTX1NQSV9QQ0xLX0RJVl8zMg0KICAgICAgICAtIE1TU19TUElfUENMS19ESVZfNjQNCiAgICAgICAgLSBNU1NfU1BJX1BDTEtfRElWXzEyOA0KICAgICAgICAtIE1TU19TUElfUENMS19ESVZfMjU2DQogICAgICAgDQogIEBwYXJhbSBmcmFtZV9iaXRfbGVuZ3RoDQogICAgTnVtYmVyIG9mIGJpdHMgbWFraW5nIHVwIHRoZSBmcmFtZS4gVGhlIG1heGltdW0gZnJhbWUgbGVuZ3RoIGlzIDMyIGJpdHMuIFlvdQ0KICAgIG11c3QgdXNlIHRoZSBNU1NfU1BJX0JMT0NLX1RSQU5TRkVSX0ZSQU1FX1NJWkUgY29uc3RhbnQgYXMgdGhlIHZhbHVlIGZvcg0KICAgIGZyYW1lX2JpdF9sZW5ndGggd2hlbiBjb25maWd1cmluZyB0aGUgTVNTIFNQSSBtYXN0ZXIgZm9yIGJsb2NrIHRyYW5zZmVyDQogICAgdHJhbnNhY3Rpb25zIHdpdGggdGhlIHRhcmdldCBTUEkgc2xhdmUuDQogIA0KICBFeGFtcGxlOg0KICBAY29kZQ0KICBNU1NfU1BJX2luaXQoICZnX21zc19zcGkwICk7DQogIE1TU19TUElfY29uZmlndXJlX3NsYXZlX21vZGUNCiAgICAoDQogICAgICAgICZnX21zc19zcGkwLA0KICAgICAgICBNU1NfU1BJX01PREUyLA0KICAgICAgICBNU1NfU1BJX1BDTEtfRElWXzY0LA0KICAgICAgICBNU1NfU1BJX0JMT0NLX1RSQU5TRkVSX0ZSQU1FX1NJWkUNCiAgICApOw0KICBAZW5kY29kZQ0KICANCiAqLyANCnZvaWQgTVNTX1NQSV9jb25maWd1cmVfc2xhdmVfbW9kZQ0KKA0KCW1zc19zcGlfaW5zdGFuY2VfdCAqIHRoaXNfc3BpLA0KICAgIG1zc19zcGlfcHJvdG9jb2xfbW9kZV90IHByb3RvY29sX21vZGUsDQogICAgbXNzX3NwaV9wY2xrX2Rpdl90IGNsa19yYXRlLA0KICAgIHVpbnQ4X3QgZnJhbWVfYml0X2xlbmd0aA0KKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIE1TU19TUElfY29uZmlndXJlX21hc3Rlcl9tb2RlKCkgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgcHJvdG9jb2wgbW9kZSwNCiAgc2VyaWFsIGNsb2NrIHNwZWVkIGFuZCBmcmFtZSBzaXplIGZvciBhIHNwZWNpZmljIHRhcmdldCBTUEkgc2xhdmUgZGV2aWNlLiBJdA0KICBpcyB1c2VkIHdoZW4gdGhlIE1TUyBTUEkgaGFyZHdhcmUgYmxvY2sgaXMgdXNlZCBhcyBhIFNQSSBtYXN0ZXIuIFRoaXMgZnVuY3Rpb24NCiAgbXVzdCBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCB0YXJnZXQgU1BJIHNsYXZlIHRoZSBTUEkgbWFzdGVyIGlzIGdvaW5nIHRvDQogIGNvbW11bmljYXRlIHdpdGguIFRoZSBTUEkgbWFzdGVyIGhhcmR3YXJlIHdpbGwgYmUgY29uZmlndXJlZCB3aXRoIHRoZQ0KICBjb25maWd1cmF0aW9uIHNwZWNpZmllZCBieSB0aGlzIGZ1bmN0aW9uIGR1cmluZyBjYWxscyB0bw0KICBNU1NfU1BJX3NldF9zbGF2ZV9zZWxlY3QoKS4NCiAgDQogIEBwYXJhbSB0aGlzX3NwaQ0KICAgIFRoZSB0aGlzX3NwaSBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIG1zc19zcGlfaW5zdGFuY2VfdCBzdHJ1Y3R1cmUNCiAgICBpZGVudGlmeWluZyB0aGUgTVNTIFNQSSBoYXJkd2FyZSBibG9jayB0byBiZSBpbml0aWFsaXplZC4gVGhlcmUgYXJlIHR3byBzdWNoDQogICAgZGF0YSBzdHJ1Y3R1cmVzLCBnX21zc19zcGkwIGFuZCBnX21zc19zcGkxLCBhc3NvY2lhdGVkIHdpdGggTVNTIFNQSSAwIGFuZA0KICAgIE1TUyBTUEkgMSByZXNwZWN0aXZlbHkuIFRoaXMgcGFyYW1ldGVyIG11c3QgcG9pbnQgdG8gZWl0aGVyIHRoZSBnX21zc19zcGkwDQogICAgb3IgZ19tc3Nfc3BpMSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5lZCB3aXRoaW4gdGhlIFNQSSBkcml2ZXIuDQogICAgDQogICAgDQogIEBwYXJhbSBzbGF2ZQ0KICAgIFRoZSBzbGF2ZSBwYXJhbWV0ZXIgaXMgdXNlZCB0byBpZGVudGlmeSBhIHRhcmdldCBTUEkgc2xhdmUuIFRoZSBkcml2ZXIgd2lsbA0KICAgIGhvbGQgdGhlIE1TUyBTUEkgbWFzdGVyIGNvbmZpZ3VyYXRpb24gcmVxdWlyZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGlzDQogICAgc2xhdmUsIGFzIHNwZWNpZmllZCBieSB0aGUgb3RoZXIgZnVuY3Rpb24gcGFyYW1ldGVycy4gQWxsb3dlZCB2YWx1ZXMgYXJlOg0KICAgICAgICCVIE1TU19TUElfU0xBVkVfMA0KICAgICAgICCVIE1TU19TUElfU0xBVkVfMQ0KICAgICAgICCVIE1TU19TUElfU0xBVkVfMg0KICAgICAgICCVIE1TU19TUElfU0xBVkVfMw0KICAgICAgICCVIE1TU19TUElfU0xBVkVfNA0KICAgICAgICCVIE1TU19TUElfU0xBVkVfNQ0KICAgICAgICCVIE1TU19TUElfU0xBVkVfNg0KICAgICAgICCVIE1TU19TUElfU0xBVkVfNw0KICAgIA0KICBAcGFyYW0gcHJvdG9jb2xfbW9kZQ0KICAgIFNlcmlhbCBwZXJpcGhlcmFsIGludGVyZmFjZSBvcGVyYXRpbmcgbW9kZS4gQWxsb3dlZCB2YWx1ZXMgYXJlOg0KICAgICAgICCVIE1TU19TUElfTU9ERTANCiAgICAgICAglSBNU1NfU1BJX01PREUxDQogICAgICAgIJUgTVNTX1NQSV9NT0RFMg0KICAgICAgICCVIE1TU19TUElfTU9ERTMNCiAgICAgICAglSBNU1NfU1BJX1RJX01PREUNCiAgICAgICAglSBNU1NfU1BJX05TQ19NT0RFDQogDQogIEBwYXJhbSBjbGtfcmF0ZQ0KICAgIERpdmlkZXIgdmFsdWUgdXNlZCB0byBnZW5lcmF0ZSBzZXJpYWwgaW50ZXJmYWNlIGNsb2NrIHNpZ25hbCBmcm9tIFBDTEsuDQogICAgQWxsb3dlZCB2YWx1ZXMgYXJlOg0KICAgICAgICCVIE1TU19TUElfUENMS19ESVZfMg0KICAgICAgICCVIE1TU19TUElfUENMS19ESVZfNA0KICAgICAgICCVIE1TU19TUElfUENMS19ESVZfOA0KICAgICAgICCVIE1TU19TUElfUENMS19ESVZfMTYNCiAgICAgICAglSBNU1NfU1BJX1BDTEtfRElWXzMyDQogICAgICAgIJUgTVNTX1NQSV9QQ0xLX0RJVl82NA0KICAgICAgICCVIE1TU19TUElfUENMS19ESVZfMTI4DQogICAgICAgIJUgTVNTX1NQSV9QQ0xLX0RJVl8yNTYNCiAgICAgICAgDQogIEBwYXJhbSBmcmFtZV9iaXRfbGVuZ3RoDQogICAgTnVtYmVyIG9mIGJpdHMgbWFraW5nIHVwIHRoZSBmcmFtZS4gVGhlIG1heGltdW0gZnJhbWUgbGVuZ3RoIGlzIDMyIGJpdHMuIFlvdQ0KICAgIG11c3QgdXNlIHRoZSBNU1NfU1BJX0JMT0NLX1RSQU5TRkVSX0ZSQU1FX1NJWkUgY29uc3RhbnQgYXMgdGhlIHZhbHVlIGZvcg0KICAgIGZyYW1lX2JpdF9sZW5ndGggd2hlbiBjb25maWd1cmluZyB0aGUgTVNTIFNQSSBtYXN0ZXIgZm9yIGJsb2NrIHRyYW5zZmVyDQogICAgdHJhbnNhY3Rpb25zIHdpdGggdGhlIHRhcmdldCBTUEkgc2xhdmUuDQogICAgDQogIEV4YW1wbGU6DQogIEBjb2RlDQogIE1TU19TUElfaW5pdCggJmdfbXNzX3NwaTAgKTsNCg0KICBNU1NfU1BJX2NvbmZpZ3VyZV9tYXN0ZXJfbW9kZQ0KICAgICgNCiAgICAgICAgJmdfbXNzX3NwaTAsDQogICAgICAgIE1TU19TUElfU0xBVkVfMCwNCiAgICAgICAgTVNTX1NQSV9NT0RFMiwNCiAgICAgICAgTVNTX1NQSV9QQ0xLX0RJVl82NCwNCiAgICAgICAgMTINCiAgICAgKTsNCg0KICBNU1NfU1BJX2NvbmZpZ3VyZV9tYXN0ZXJfbW9kZQ0KICAgICgNCiAgICAgICAgJmdfbXNzX3NwaTAsDQogICAgICAgIE1TU19TUElfU0xBVkVfMSwNCiAgICAgICAgTVNTX1NQSV9USV9NT0RFLA0KICAgICAgICBNU1NfU1BJX1BDTEtfRElWXzEyOCwNCiAgICAgICAgTVNTX1NQSV9CTE9DS19UUkFOU0ZFUl9GUkFNRV9TSVpFDQogICAgICk7DQogIEBlbmRjb2RlDQogKi8gDQp2b2lkIE1TU19TUElfY29uZmlndXJlX21hc3Rlcl9tb2RlDQooDQoJbXNzX3NwaV9pbnN0YW5jZV90ICogICAgdGhpc19zcGksDQoJbXNzX3NwaV9zbGF2ZV90ICAgICAgICAgc2xhdmUsDQogICAgbXNzX3NwaV9wcm90b2NvbF9tb2RlX3QgcHJvdG9jb2xfbW9kZSwNCiAgICBtc3Nfc3BpX3BjbGtfZGl2X3QgICAgICBjbGtfcmF0ZSwNCiAgICB1aW50OF90ICAgICAgICAgICAgICAgICBmcmFtZV9iaXRfbGVuZ3RoDQopOw0KDQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICogTWFzdGVyIGZ1bmN0aW9ucw0KICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIE1TU19TUElfc2xhdmVfc2VsZWN0KCkgZnVuY3Rpb24gaXMgdXNlZCBieSBhIE1TUyBTUEkgbWFzdGVyIHRvIHNlbGVjdCBhDQogIHNwZWNpZmljIHNsYXZlLiBUaGlzIGZ1bmN0aW9uIGNhdXNlcyB0aGUgcmVsZXZhbnQgc2xhdmUgc2VsZWN0IHNpZ25hbCB0byBiZQ0KICBhc3NlcnRlZC4NCiANCiAgQHBhcmFtIHRoaXNfc3BpDQogICAgVGhlIHRoaXNfc3BpIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gbXNzX3NwaV9pbnN0YW5jZV90IHN0cnVjdHVyZQ0KICAgIGlkZW50aWZ5aW5nIHRoZSBNU1MgU1BJIGhhcmR3YXJlIGJsb2NrIHRvIGJlIGluaXRpYWxpemVkLiBUaGVyZSBhcmUgdHdvIHN1Y2gNCiAgICBkYXRhIHN0cnVjdHVyZXMsIGdfbXNzX3NwaTAgYW5kIGdfbXNzX3NwaTEsIGFzc29jaWF0ZWQgd2l0aCBNU1MgU1BJIDAgYW5kDQogICAgTVNTIFNQSSAxIHJlc3BlY3RpdmVseS4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBlaXRoZXIgdGhlIGdfbXNzX3NwaTANCiAgICBvciBnX21zc19zcGkxIGdsb2JhbCBkYXRhIHN0cnVjdHVyZSBkZWZpbmVkIHdpdGhpbiB0aGUgU1BJIGRyaXZlci4NCiAgICANCiANCiAgQHBhcmFtIHNsYXZlDQogICAgVGhlIHNsYXZlIHBhcmFtZXRlciBpcyBvbmUgb2YgbXNzX3NwaV9zbGF2ZV90IGVudW1lcmF0ZWQgY29uc3RhbnRzDQogICAgaWRlbnRpZnlpbmcgYSBzbGF2ZS4NCiAgDQogIEV4YW1wbGU6DQogIEBjb2RlDQogIGNvbnN0IHVpbnQ4X3QgZnJhbWVfc2l6ZSA9IDI1Ow0KICBjb25zdCB1aW50MzJfdCBtYXN0ZXJfdHhfZnJhbWUgPSAweDAxMDBBMEUxOw0KDQogIE1TU19TUElfaW5pdCggJmdfbXNzX3NwaTAgKTsNCiAgTVNTX1NQSV9jb25maWd1cmVfbWFzdGVyX21vZGUNCiAgICAoDQogICAgICAgICZnX21zc19zcGkwLA0KICAgICAgICBNU1NfU1BJX1NMQVZFXzAsDQogICAgICAgIE1TU19TUElfTU9ERTEsDQogICAgICAgIE1TU19TUElfUENMS19ESVZfMjU2LA0KICAgICAgICBmcmFtZV9zaXplDQogICAgICk7DQoNCiAgTVNTX1NQSV9zZXRfc2xhdmVfc2VsZWN0KCAmZ19tc3Nfc3BpMCwgTVNTX1NQSV9TTEFWRV8wICk7DQogIE1TU19TUElfdHJhbnNmZXJfZnJhbWUoICZnX21zc19zcGkwLCBtYXN0ZXJfdHhfZnJhbWUgKTsNCiAgTVNTX1NQSV9jbGVhcl9zbGF2ZV9zZWxlY3QoICZnX21zc19zcGkwLCBNU1NfU1BJX1NMQVZFXzAgKTsNCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZCBNU1NfU1BJX3NldF9zbGF2ZV9zZWxlY3QNCigNCgltc3Nfc3BpX2luc3RhbmNlX3QgKiB0aGlzX3NwaSwNCgltc3Nfc3BpX3NsYXZlX3Qgc2xhdmUNCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBNU1NfU1BJX2NsZWFyX3NsYXZlX3NlbGVjdCgpIGZ1bmN0aW9uIGlzIHVzZWQgYnkgYSBNU1MgU1BJIE1hc3RlciB0bw0KICBkZXNlbGVjdCBhIHNwZWNpZmljIHNsYXZlLiBUaGlzIGZ1bmN0aW9uIGNhdXNlcyB0aGUgcmVsZXZhbnQgc2xhdmUgc2VsZWN0DQogIHNpZ25hbCB0byBiZSBkZS1hc3NlcnRlZC4NCiANCiAgQHBhcmFtIHRoaXNfc3BpDQogICAgVGhlIHRoaXNfc3BpIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gbXNzX3NwaV9pbnN0YW5jZV90IHN0cnVjdHVyZQ0KICAgIGlkZW50aWZ5aW5nIHRoZSBNU1MgU1BJIGhhcmR3YXJlIGJsb2NrIHRvIGJlIGluaXRpYWxpemVkLiBUaGVyZSBhcmUgdHdvIHN1Y2gNCiAgICBkYXRhIHN0cnVjdHVyZXMsIGdfbXNzX3NwaTAgYW5kIGdfbXNzX3NwaTEsIGFzc29jaWF0ZWQgd2l0aCBNU1MgU1BJIDAgYW5kDQogICAgTVNTIFNQSSAxIHJlc3BlY3RpdmVseS4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBlaXRoZXIgdGhlIGdfbXNzX3NwaTANCiAgICBvciBnX21zc19zcGkxIGdsb2JhbCBkYXRhIHN0cnVjdHVyZSBkZWZpbmVkIHdpdGhpbiB0aGUgU1BJIGRyaXZlci4NCiAgICANCiANCiAgQHBhcmFtIHNsYXZlDQogICAgVGhlIHNsYXZlIHBhcmFtZXRlciBpcyBvbmUgb2YgbXNzX3NwaV9zbGF2ZV90IGVudW1lcmF0ZWQgY29uc3RhbnRzDQogICAgaWRlbnRpZnlpbmcgYSBzbGF2ZS4NCiAgDQogIEV4YW1wbGU6DQogIEBjb2RlDQogIGNvbnN0IHVpbnQ4X3QgZnJhbWVfc2l6ZSA9IDI1Ow0KICBjb25zdCB1aW50MzJfdCBtYXN0ZXJfdHhfZnJhbWUgPSAweDAxMDBBMEUxOw0KDQogIE1TU19TUElfaW5pdCggJmdfbXNzX3NwaTAgKTsNCiAgTVNTX1NQSV9jb25maWd1cmVfbWFzdGVyX21vZGUNCiAgICAoDQogICAgICAgICZnX21zc19zcGkwLA0KICAgICAgICBNU1NfU1BJX1NMQVZFXzAsDQogICAgICAgIE1TU19TUElfTU9ERTEsDQogICAgICAgIE1TU19TUElfUENMS19ESVZfMjU2LA0KICAgICAgICBmcmFtZV9zaXplDQogICAgICk7DQogIE1TU19TUElfc2V0X3NsYXZlX3NlbGVjdCggJmdfbXNzX3NwaTAsIE1TU19TUElfU0xBVkVfMCApOw0KICBNU1NfU1BJX3RyYW5zZmVyX2ZyYW1lKCAmZ19tc3Nfc3BpMCwgbWFzdGVyX3R4X2ZyYW1lICk7DQogIE1TU19TUElfY2xlYXJfc2xhdmVfc2VsZWN0KCAmZ19tc3Nfc3BpMCwgTVNTX1NQSV9TTEFWRV8wICk7DQogIEBlbmRjb2RlDQogKi8NCnZvaWQgTVNTX1NQSV9jbGVhcl9zbGF2ZV9zZWxlY3QNCigNCgltc3Nfc3BpX2luc3RhbmNlX3QgKiB0aGlzX3NwaSwNCgltc3Nfc3BpX3NsYXZlX3Qgc2xhdmUNCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBNU1NfU1BJX2Rpc2FibGUoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIHRlbXBvcmFyaWx5IGRpc2FibGUgYSBNU1MgU1BJDQogIGhhcmR3YXJlIGJsb2NrLiBUaGlzIGZ1bmN0aW9uIGlzIHR5cGljYWxseSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlDQogIFNQSV9zZXRfdHJhbnNmZXJfYnl0ZV9jb3VudCgpIGZ1bmN0aW9uIHRvIHNldHVwIGEgRE1BIGNvbnRyb2xsZWQgU1BJIHRyYW5zbWl0DQogIHRyYW5zYWN0aW9uIGFzIHRoZSBTUElfc2V0X3RyYW5zZmVyX2J5dGVfY291bnQoKSBmdW5jdGlvbiBtdXN0IG9ubHkgYmUgdXNlZA0KICB3aGVuIHRoZSBNU1MgU1BJIGhhcmR3YXJlIGlzIGRpc2FibGVkLg0KIA0KICBAcGFyYW0gdGhpc19zcGkNCiAgICBUaGUgdGhpc19zcGkgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBtc3Nfc3BpX2luc3RhbmNlX3Qgc3RydWN0dXJlDQogICAgaWRlbnRpZnlpbmcgdGhlIE1TUyBTUEkgaGFyZHdhcmUgYmxvY2sgdG8gYmUgaW5pdGlhbGl6ZWQuIFRoZXJlIGFyZSB0d28gc3VjaA0KICAgIGRhdGEgc3RydWN0dXJlcywgZ19tc3Nfc3BpMCBhbmQgZ19tc3Nfc3BpMSwgYXNzb2NpYXRlZCB3aXRoIE1TUyBTUEkgMCBhbmQNCiAgICBNU1MgU1BJIDEgcmVzcGVjdGl2ZWx5LiBUaGlzIHBhcmFtZXRlciBtdXN0IHBvaW50IHRvIGVpdGhlciB0aGUgZ19tc3Nfc3BpMA0KICAgIG9yIGdfbXNzX3NwaTEgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIGRlZmluZWQgd2l0aGluIHRoZSBTUEkgZHJpdmVyLg0KICANCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgdWludDMyX3QgdHJhbnNmZXJfc2l6ZTsNCiAgdWludDhfdCB0eF9idWZmZXJbOF0gPSB7IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDggfTsNCiAgDQogIHRyYW5zZmVyX3NpemUgPSBzaXplb2YodHhfYnVmZmVyKTsNCiAgDQogIE1TU19TUElfZGlzYWJsZSggJmdfbXNzX3NwaTAgKTsNCiAgTVNTX1NQSV9zZXRfdHJhbnNmZXJfYnl0ZV9jb3VudCggJmdfbXNzX3NwaTAsIHRyYW5zZmVyX3NpemUgKTsNCiAgUERNQV9zdGFydA0KICAgICgNCiAgICAgICAgUERNQV9DSEFOTkVMXzAsDQogICAgICAgICh1aW50MzJfdCl0eF9idWZmZXIsDQogICAgICAgIFBETUFfU1BJMV9UWF9SRUdJU1RFUiwNCiAgICAgICAgdHJhbnNmZXJfc2l6ZQ0KICAgICk7DQogIE1TU19TUElfZW5hYmxlKCAmZ19tc3Nfc3BpMCApOw0KICANCiAgd2hpbGUgKCAhTVNTX1NQSV90eF9kb25lKCAmZ19tc3Nfc3BpMCApICkNCiAgew0KICAgICAgOw0KICB9DQogIEBlbmRjb2RlDQogKi8NCnN0YXRpYyBfX0lOTElORSB2b2lkIE1TU19TUElfZGlzYWJsZQ0KKA0KICAgIG1zc19zcGlfaW5zdGFuY2VfdCAqIHRoaXNfc3BpDQopDQp7DQogICAgdGhpc19zcGktPmh3X3JlZ19iaXQtPkNUUkxfRU5BQkxFID0gMDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIE1TU19TUElfZW5hYmxlKCkgZnVuY3Rpb24gaXMgdXNlZCB0byByZS1lbmFibGUgYSBNU1MgU1BJIGhhcmR3YXJlIGJsb2NrDQogIGFmdGVyIGl0IHdhcyBkaXNhYmxlZCB1c2luZyB0aGUgU1BJX2Rpc2FibGUoKSBmdW5jdGlvbi4NCiANCiAgQHBhcmFtIHRoaXNfc3BpDQogICAgVGhlIHRoaXNfc3BpIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gbXNzX3NwaV9pbnN0YW5jZV90IHN0cnVjdHVyZQ0KICAgIGlkZW50aWZ5aW5nIHRoZSBNU1MgU1BJIGhhcmR3YXJlIGJsb2NrIHRvIGJlIGluaXRpYWxpemVkLiBUaGVyZSBhcmUgdHdvIHN1Y2gNCiAgICBkYXRhIHN0cnVjdHVyZXMsIGdfbXNzX3NwaTAgYW5kIGdfbXNzX3NwaTEsIGFzc29jaWF0ZWQgd2l0aCBNU1MgU1BJIDAgYW5kDQogICAgTVNTIFNQSSAxIHJlc3BlY3RpdmVseS4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBlaXRoZXIgdGhlIGdfbXNzX3NwaTANCiAgICBvciBnX21zc19zcGkxIGdsb2JhbCBkYXRhIHN0cnVjdHVyZSBkZWZpbmVkIHdpdGhpbiB0aGUgU1BJIGRyaXZlci4NCiAgICANCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgdWludDMyX3QgdHJhbnNmZXJfc2l6ZTsNCiAgdWludDhfdCB0eF9idWZmZXJbOF0gPSB7IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDggfTsNCiAgDQogIHRyYW5zZmVyX3NpemUgPSBzaXplb2YodHhfYnVmZmVyKTsNCiAgDQogIE1TU19TUElfZGlzYWJsZSggJmdfbXNzX3NwaTAgKTsNCiAgTVNTX1NQSV9zZXRfdHJhbnNmZXJfYnl0ZV9jb3VudCggJmdfbXNzX3NwaTAsIHRyYW5zZmVyX3NpemUgKTsNCiAgUERNQV9zdGFydA0KICAgICgNCiAgICAgICAgUERNQV9DSEFOTkVMXzAsDQogICAgICAgICh1aW50MzJfdCl0eF9idWZmZXIsDQogICAgICAgIFBETUFfU1BJMV9UWF9SRUdJU1RFUiwNCiAgICAgICAgdHJhbnNmZXJfc2l6ZQ0KICAgICk7DQogIE1TU19TUElfZW5hYmxlKCAmZ19tc3Nfc3BpMCApOw0KICANCiAgd2hpbGUgKCAhTVNTX1NQSV90eF9kb25lKCAmZ19tc3Nfc3BpMCApICkNCiAgew0KICAgICAgOw0KICB9DQogIEBlbmRjb2RlDQogKi8NCnN0YXRpYyBfX0lOTElORSB2b2lkIE1TU19TUElfZW5hYmxlDQooDQogICAgbXNzX3NwaV9pbnN0YW5jZV90ICogdGhpc19zcGkNCikNCnsNCiAgICB0aGlzX3NwaS0+aHdfcmVnX2JpdC0+Q1RSTF9FTkFCTEUgPSAxOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGUgTVNTX1NQSV9zZXRfdHJhbnNmZXJfYnl0ZV9jb3VudCgpIGZ1bmN0aW9uIGlzIHVzZWQgYXMgcGFydCBvZiBzZXR0aW5nIHVwDQogIGEgU1BJIHRyYW5zZmVyIHVzaW5nIERNQS4gSXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtdXN0IGJlDQogIHRyYW5zZmVycmVkIGJlZm9yZSBNU1NfU1BJX3R4X2RvbmUoKSBpbmRpY2F0ZXMgdGhhdCB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGUuDQogDQogIEBwYXJhbSB0aGlzX3NwaQ0KICAgIFRoZSB0aGlzX3NwaSBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIG1zc19zcGlfaW5zdGFuY2VfdCBzdHJ1Y3R1cmUNCiAgICBpZGVudGlmeWluZyB0aGUgTVNTIFNQSSBoYXJkd2FyZSBibG9jayB0byBiZSBpbml0aWFsaXplZC4gVGhlcmUgYXJlIHR3byBzdWNoDQogICAgZGF0YSBzdHJ1Y3R1cmVzLCBnX21zc19zcGkwIGFuZCBnX21zc19zcGkxLCBhc3NvY2lhdGVkIHdpdGggTVNTIFNQSSAwIGFuZA0KICAgIE1TUyBTUEkgMSByZXNwZWN0aXZlbHkuIFRoaXMgcGFyYW1ldGVyIG11c3QgcG9pbnQgdG8gZWl0aGVyIHRoZSBnX21zc19zcGkwDQogICAgb3IgZ19tc3Nfc3BpMSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5lZCB3aXRoaW4gdGhlIFNQSSBkcml2ZXIuDQogICAgDQogDQogIEBwYXJhbSBieXRlX2NvdW50DQogICAgVGhlIGJ5dGVfY291bnQgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbXVzdCBiZQ0KICAgIHRyYW5zZmVycmVkIGJ5IHRoZSBTUEkgaGFyZHdhcmUgYmxvY2sgY29uc2lkZXJpbmcgdGhhdCBhIHRyYW5zYWN0aW9uIGhhcw0KICAgIGJlZW4gY29tcGxldGVkLg0KICANCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgdWludDMyX3QgdHJhbnNmZXJfc2l6ZTsNCiAgdWludDhfdCB0eF9idWZmZXJbOF0gPSB7IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDggfTsNCiAgDQogIHRyYW5zZmVyX3NpemUgPSBzaXplb2YodHhfYnVmZmVyKTsNCiAgDQogIE1TU19TUElfZGlzYWJsZSggJmdfbXNzX3NwaTAgKTsNCiAgDQogIE1TU19TUElfc2V0X3RyYW5zZmVyX2J5dGVfY291bnQoICZnX21zc19zcGkwLCB0cmFuc2Zlcl9zaXplICk7DQogIA0KICBQRE1BX3N0YXJ0KCBQRE1BX0NIQU5ORUxfMCwgKHVpbnQzMl90KXR4X2J1ZmZlciwgMHg0MDAxMTAxNCwgdHJhbnNmZXJfc2l6ZSApOw0KICANCiAgTVNTX1NQSV9lbmFibGUoICZnX21zc19zcGkwICk7DQogIA0KICB3aGlsZSAoICFNU1NfU1BJX3R4X2RvbmUoICZnX21zc19zcGkwKSApDQogIHsNCiAgICAgIDsNCiAgfQ0KICBAZW5kY29kZQ0KICovDQpzdGF0aWMgX19JTkxJTkUgdm9pZCBNU1NfU1BJX3NldF90cmFuc2Zlcl9ieXRlX2NvdW50DQooDQogICAgbXNzX3NwaV9pbnN0YW5jZV90ICogdGhpc19zcGksDQogICAgdWludDE2X3QgYnl0ZV9jb3VudA0KKQ0Kew0KICAgIGNvbnN0IHVpbnQzMl90IFRYUlhERkNPVU5UX1NISUZUID0gOFU7DQogICAgY29uc3QgdWludDMyX3QgVFhSWERGQ09VTlRfTUFTSyA9IDB4MDBGRkZGMDBVOw0KICAgIA0KICAgIHRoaXNfc3BpLT5od19yZWctPkNPTlRST0wgPSAodGhpc19zcGktPmh3X3JlZy0+Q09OVFJPTCAmIH5UWFJYREZDT1VOVF9NQVNLKSB8ICggKGJ5dGVfY291bnQgPDwgVFhSWERGQ09VTlRfU0hJRlQpICYgVFhSWERGQ09VTlRfTUFTSyk7DQogICAgdGhpc19zcGktPmh3X3JlZy0+VFhSWERGX1NJWkUgPSA4VTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIE1TU19TUElfdHhfZG9uZSgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZmluZCBvdXQgaWYgYSBETUEgY29udHJvbGxlZCB0cmFuc2Zlcg0KICBoYXMgY29tcGxldGVkLg0KIA0KICBAcGFyYW0gdGhpc19zcGkNCiAgICBUaGUgdGhpc19zcGkgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBtc3Nfc3BpX2luc3RhbmNlX3Qgc3RydWN0dXJlDQogICAgaWRlbnRpZnlpbmcgdGhlIE1TUyBTUEkgaGFyZHdhcmUgYmxvY2sgdG8gYmUgaW5pdGlhbGl6ZWQuIFRoZXJlIGFyZSB0d28gc3VjaA0KICAgIGRhdGEgc3RydWN0dXJlcywgZ19tc3Nfc3BpMCBhbmQgZ19tc3Nfc3BpMSwgYXNzb2NpYXRlZCB3aXRoIE1TUyBTUEkgMCBhbmQNCiAgICBNU1MgU1BJIDEgcmVzcGVjdGl2ZWx5LiBUaGlzIHBhcmFtZXRlciBtdXN0IHBvaW50IHRvIGVpdGhlciB0aGUgZ19tc3Nfc3BpMA0KICAgIG9yIGdfbXNzX3NwaTEgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIGRlZmluZWQgd2l0aGluIHRoZSBTUEkgZHJpdmVyLg0KICANCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICAgIHVpbnQzMl90IHRyYW5zZmVyX3NpemU7DQogICAgICB1aW50OF90IHR4X2J1ZmZlcls4XSA9IHsgMSwgMiwgMywgNCwgNSwgNiwgNywgOCB9Ow0KICAgICAgDQogICAgICB0cmFuc2Zlcl9zaXplID0gc2l6ZW9mKHR4X2J1ZmZlcik7DQogICAgICANCiAgICAgIE1TU19TUElfZGlzYWJsZSggJmdfbXNzX3NwaTAgKTsNCiAgICAgIA0KICAgICAgTVNTX1NQSV9zZXRfdHJhbnNmZXJfYnl0ZV9jb3VudCggJmdfbXNzX3NwaTAsIHRyYW5zZmVyX3NpemUgKTsNCiAgICAgIA0KICAgICAgUERNQV9zdGFydA0KICAgICAgICAoDQogICAgICAgICAgICBQRE1BX0NIQU5ORUxfMCwNCiAgICAgICAgICAgICh1aW50MzJfdCl0eF9idWZmZXIsDQogICAgICAgICAgICBQRE1BX1NQSTFfVFhfUkVHSVNURVIsDQogICAgICAgICAgICB0cmFuc2Zlcl9zaXplDQogICAgICAgICk7DQogICAgICANCiAgICAgIE1TU19TUElfZW5hYmxlKCAmZ19tc3Nfc3BpMCApOw0KICAgICAgDQogICAgICB3aGlsZSAoICFNU1NfU1BJX3R4X2RvbmUoJmdfbXNzX3NwaTApICkNCiAgICAgIHsNCiAgICAgICAgICA7DQogICAgICB9DQogIEBlbmRjb2RlDQogKi8NCnN0YXRpYyBfX0lOTElORSB1aW50MzJfdCBNU1NfU1BJX3R4X2RvbmUNCigNCiAgICBtc3Nfc3BpX2luc3RhbmNlX3QgKiB0aGlzX3NwaQ0KKQ0Kew0KICAgIHJldHVybiB0aGlzX3NwaS0+aHdfcmVnX2JpdC0+U1RBVFVTX1RYX0RPTkU7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBNU1NfU1BJX3RyYW5zZmVyX2ZyYW1lKCkgZnVuY3Rpb24gaXMgdXNlZCBieSBhIE1TUyBTUEkgbWFzdGVyIHRvIHRyYW5zbWl0DQogIGFuZCByZWNlaXZlIGEgZnJhbWUgdXAgdG8gMzIgYml0cyBsb25nLiBUaGlzIGZ1bmN0aW9uIGlzIHR5cGljYWxseSB1c2VkIGZvcg0KICB0cmFuc2FjdGlvbnMgd2l0aCBhIFNQSSBzbGF2ZSB3aGVyZSB0aGUgbnVtYmVyIG9mIHRyYW5zbWl0IGFuZCByZWNlaXZlIGJpdHMgaXMNCiAgbm90IGRpdmlzaWJsZSBieSA4Lg0KIA0KICBAcGFyYW0gdGhpc19zcGkNCiAgICBUaGUgdGhpc19zcGkgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBtc3Nfc3BpX2luc3RhbmNlX3Qgc3RydWN0dXJlDQogICAgaWRlbnRpZnlpbmcgdGhlIE1TUyBTUEkgaGFyZHdhcmUgYmxvY2sgdG8gYmUgaW5pdGlhbGl6ZWQuIFRoZXJlIGFyZSB0d28gc3VjaA0KICAgIGRhdGEgc3RydWN0dXJlcywgZ19tc3Nfc3BpMCBhbmQgZ19tc3Nfc3BpMSwgYXNzb2NpYXRlZCB3aXRoIE1TUyBTUEkgMCBhbmQNCiAgICBNU1MgU1BJIDEgcmVzcGVjdGl2ZWx5LiBUaGlzIHBhcmFtZXRlciBtdXN0IHBvaW50IHRvIGVpdGhlciB0aGUgZ19tc3Nfc3BpMA0KICAgIG9yIGdfbXNzX3NwaTEgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIGRlZmluZWQgd2l0aGluIHRoZSBTUEkgZHJpdmVyLg0KICAgIA0KIA0KICBAcGFyYW0gdHhfYml0cw0KICAgIFRoZSB0eF9iaXRzIHBhcmFtZXRlciBpcyBhIDMyIGJpdHMgd29yZCBjb250YWluaW5nIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUNCiAgICB0cmFuc21pdHRlZC4NCiAgICBOb3RlOiAgIFRoZSBiaXQgbGVuZ3RoIG9mIHRoZSB2YWx1ZSB0byBiZSB0cmFuc21pdHRlZCB0byB0aGUgc2xhdmUgbXVzdCBiZQ0KICAgICAgICAgICAgc3BlY2lmaWVkIGFzIHRoZSBmcmFtZV9iaXRfbGVuZ3RoIHBhcmFtZXRlciBpbiBhIHByZXZpb3VzIGNhbGwgdG8NCiAgICAgICAgICAgIHRoZSBNU1NfU1BJX2NvbmZpZ3VyZV9tYXN0ZXIoKSBmdW5jdGlvbi4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgMzIgYml0cyB3b3JkIGNvbnRhaW5pbmcgdGhlIHZhbHVlIHRoYXQgaXMgcmVjZWl2ZWQNCiAgICBmcm9tIHRoZSBzbGF2ZS4NCiANCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICAgIGNvbnN0IHVpbnQ4X3QgZnJhbWVfc2l6ZSA9IDI1Ow0KICAgICAgY29uc3QgdWludDMyX3QgbWFzdGVyX3R4X2ZyYW1lID0gMHgwMTAwQTBFMTsNCiAgICAgIHVpbnQzMl90IG1hc3Rlcl9yeDsNCiAgICAgIA0KICAgICAgTVNTX1NQSV9pbml0KCAmZ19tc3Nfc3BpMCApOw0KICAgICAgTVNTX1NQSV9jb25maWd1cmVfbWFzdGVyX21vZGUNCiAgICAgICAgKA0KICAgICAgICAgICAgJmdfbXNzX3NwaTAsDQogICAgICAgICAgICBNU1NfU1BJX1NMQVZFXzAsDQogICAgICAgICAgICBNU1NfU1BJX01PREUxLA0KICAgICAgICAgICAgTVNTX1NQSV9QQ0xLX0RJVl8yNTYsDQogICAgICAgICAgICBmcmFtZV9zaXplDQogICAgICAgICApOw0KICAgICANCiAgICAgIE1TU19TUElfc2V0X3NsYXZlX3NlbGVjdCggJmdfbXNzX3NwaTAsIE1TU19TUElfU0xBVkVfMCApOw0KICAgICAgbWFzdGVyX3J4ID0gTVNTX1NQSV90cmFuc2Zlcl9mcmFtZSggJmdfbXNzX3NwaTAsIG1hc3Rlcl90eF9mcmFtZSApOw0KICAgICAgTVNTX1NQSV9jbGVhcl9zbGF2ZV9zZWxlY3QoICZnX21zc19zcGkwLCBNU1NfU1BJX1NMQVZFXzAgKTsNCiAgQGVuZGNvZGUNCiAqLw0KdWludDMyX3QgTVNTX1NQSV90cmFuc2Zlcl9mcmFtZQ0KKA0KICAgIG1zc19zcGlfaW5zdGFuY2VfdCAqIHRoaXNfc3BpLA0KICAgIHVpbnQzMl90IHR4X2JpdHMNCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBNU1NfU1BJX3RyYW5zZmVyX2Jsb2NrKCkgZnVuY3Rpb24gaXMgdXNlZCBieSBNU1MgU1BJIG1hc3RlcnMgdG8gdHJhbnNtaXQNCiAgYW5kIHJlY2VpdmUgYmxvY2tzIG9mIGRhdGEgb3JnYW5pemVkIGFzIGEgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcy4gSXQgY2FuIGJlDQogIHVzZWQgZm9yOg0KICAgIJUgV3JpdGluZyBhIGRhdGEgYmxvY2sgdG8gYSBzbGF2ZQ0KICAgIJUgUmVhZGluZyBhIGRhdGEgYmxvY2sgZnJvbSBhIHNsYXZlDQogICAglSBTZW5kaW5nIGEgY29tbWFuZCB0byBhIHNsYXZlIGZvbGxvd2VkIGJ5IHJlYWRpbmcgdGhlIG91dGNvbWUgb2YgdGhlDQogICAgICBjb21tYW5kIGluIGEgc2luZ2xlIFNQSSB0cmFuc2FjdGlvbi4gVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBhbG9uZ3NpZGUNCiAgICAgIFBlcmlwaGVyYWwgRE1BIGZ1bmN0aW9ucyB0byBwZXJmb3JtIHRoZSBhY3R1YWwgbW92aW5nIHRvIGFuZCBmcm9tIHRoZSBTUEkNCiAgICAgIGhhcmR3YXJlIGJsb2NrIHVzaW5nIFBlcmlwaGVyYWwgRE1BLg0KIA0KICBAcGFyYW0gdGhpc19zcGkNCiAgICBUaGUgdGhpc19zcGkgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBtc3Nfc3BpX2luc3RhbmNlX3Qgc3RydWN0dXJlDQogICAgaWRlbnRpZnlpbmcgdGhlIE1TUyBTUEkgaGFyZHdhcmUgYmxvY2sgdG8gYmUgaW5pdGlhbGl6ZWQuIFRoZXJlIGFyZSB0d28gc3VjaA0KICAgIGRhdGEgc3RydWN0dXJlcywgZ19tc3Nfc3BpMCBhbmQgZ19tc3Nfc3BpMSwgYXNzb2NpYXRlZCB3aXRoIE1TUyBTUEkgMCBhbmQNCiAgICBNU1MgU1BJIDEgcmVzcGVjdGl2ZWx5LiBUaGlzIHBhcmFtZXRlciBtdXN0IHBvaW50IHRvIGVpdGhlciB0aGUgZ19tc3Nfc3BpMA0KICAgIG9yIGdfbXNzX3NwaTEgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIGRlZmluZWQgd2l0aGluIHRoZSBTUEkgZHJpdmVyLg0KICAgIA0KIA0KICBAcGFyYW0gY21kX2J1ZmZlcg0KICAgIFRoZSBjbWRfYnVmZmVyIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIHRoYXQNCiAgICB3aWxsIGJlIHNlbnQgYnkgdGhlIG1hc3RlciBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRyYW5zZmVyLiBUaGlzIHBvaW50ZXINCiAgICBjYW4gYmUgbnVsbCAoMCkgaWYgdGhlIG1hc3RlciBkb2VzIG5vdCBuZWVkIHRvIHNlbmQgYSBjb21tYW5kIGJlZm9yZSByZWFkaW5nDQogICAgZGF0YSBvciBpZiB0aGUgY29tbWFuZCBwYXJ0IG9mIHRoZSB0cmFuc2ZlciBpcyB3cml0dGVuIHRvIHRoZSBTUEkgaGFyZHdhcmUNCiAgICBibG9jayB1c2luZyBETUEuDQogDQogIEBwYXJhbSBjbWRfYnl0ZV9zaXplDQogICAgVGhlIGNtZF9ieXRlX3NpemUgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnRhaW5lZCBpbg0KICAgIGNtZF9idWZmZXIgdGhhdCB3aWxsIGJlIHNlbnQuIEEgdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhhdCBubyBkYXRhIG5lZWRzIHRvDQogICAgYmUgc2VudCB0byB0aGUgc2xhdmUuIEEgbm9uLXplcm8gdmFsdWUgd2hpbGUgdGhlIGNtZF9idWZmZXIgcG9pbnRlciBpcyAwIGlzDQogICAgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIGRhdGEgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBTUEkgaGFyZHdhcmUNCiAgICBibG9jayB1c2luZyBETUEuDQogDQogIEBwYXJhbSByZF9idWZmZXINCiAgICBUaGUgcmRfYnVmZmVyIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB3aGVyZSB0aGUgZGF0YSByZWNlaXZlZA0KICAgIGZyb20gdGhlIHNsYXZlIGFmdGVyIHRoZSBjb21tYW5kIGhhcyBiZWVuIHNlbnQgd2lsbCBiZSBzdG9yZWQuDQogDQogIEBwYXJhbSByZF9ieXRlX3NpemUNCiAgICBUaGUgcmRfYnl0ZV9zaXplIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSByZWNlaXZlZCBmcm9tDQogICAgdGhlIHNsYXZlIGFuZCBzdG9yZWQgaW4gdGhlIHJkX2J1ZmZlci4gQSB2YWx1ZSBvZiAwIGluZGljYXRlcyB0aGF0IG5vIGRhdGENCiAgICBpcyB0byBiZSByZWFkIGZyb20gdGhlIHNsYXZlLiBBIG5vbi16ZXJvIHZhbHVlIHdoaWxlIHRoZSByZF9idWZmZXIgcG9pbnRlcg0KICAgIGlzIG51bGwgKDApIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVjZWl2ZSBzaXplIHdoZW4gdXNpbmcgRE1BIHRvIHJlYWQgZnJvbQ0KICAgIHRoZSBzbGF2ZS4gDQogICAgTm90ZTogICBBbGwgYnl0ZXMgcmVjZWl2ZWQgZnJvbSB0aGUgc2xhdmUsIGluY2x1ZGluZyB0aGUgYnl0ZXMgcmVjZWl2ZWQNCiAgICAgICAgICAgIHdoaWxlIHRoZSBjb21tYW5kIGlzIHNlbnQsIHdpbGwgYmUgcmVhZCB0aHJvdWdoIERNQS4NCiAgDQogIFBvbGxlZCB3cml0ZSB0cmFuc2ZlciBleGFtcGxlOg0KICBAY29kZQ0KICAgICAgdWludDhfdCBtYXN0ZXJfdHhfYnVmZmVyW01BU1RFUl9UWF9CVUZGRVJdID0gDQogICAgICB7DQogICAgICAgICAgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwgMHgzQQ0KICAgICAgfTsNCiAgICAgIE1TU19TUElfaW5pdCggJmdfbXNzX3NwaTAgKTsNCiAgICAgIE1TU19TUElfY29uZmlndXJlX21hc3Rlcl9tb2RlDQogICAgICAgICgNCiAgICAgICAgICAgICZnX21zc19zcGkwLA0KICAgICAgICAgICAgTVNTX1NQSV9TTEFWRV8wLA0KICAgICAgICAgICAgTVNTX1NQSV9NT0RFMSwNCiAgICAgICAgICAgIE1TU19TUElfUENMS19ESVZfMjU2LA0KICAgICAgICAgICAgTVNTX1NQSV9CTE9DS19UUkFOU0ZFUl9GUkFNRV9TSVpFDQogICAgICAgICApOw0KICAgICANCiAgICAgIE1TU19TUElfc2V0X3NsYXZlX3NlbGVjdCggJmdfbXNzX3NwaTAsIE1TU19TUElfU0xBVkVfMCApOw0KICAgICAgTVNTX1NQSV90cmFuc2Zlcl9ibG9jaw0KICAgICAgICAoDQogICAgICAgICAgICAmZ19tc3Nfc3BpMCwNCiAgICAgICAgICAgIG1hc3Rlcl90eF9idWZmZXIsDQogICAgICAgICAgICBzaXplb2YobWFzdGVyX3R4X2J1ZmZlciksDQogICAgICAgICAgICAwLA0KICAgICAgICAgICAgMA0KICAgICAgICApOw0KICAgICAgTVNTX1NQSV9jbGVhcl9zbGF2ZV9zZWxlY3QoICZnX21zc19zcGkwLCBNU1NfU1BJX1NMQVZFXzAgKTsNCiAgQGVuZGNvZGUNCiANCiAgRE1BIHRyYW5zZmVyIGV4YW1wbGU6DQogIEluIHRoaXMgZXhhbXBsZSB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgYnVmZmVycyBhcmUgbm90IHNwZWNpZmllZCBhcyBwYXJ0IG9mDQogIHRoZSBjYWxsIHRvIE1TU19TUElfdHJhbnNmZXJfYmxvY2soKS4gTVNTX1NQSV90cmFuc2Zlcl9ibG9jaygpIHdpbGwgb25seQ0KICBwcmVwYXJlIHRoZSBNU1MgU1BJIGhhcmR3YXJlIGZvciBhIHRyYW5zZmVyLiBUaGUgTVNTIFNQSSB0cmFuc21pdCBoYXJkd2FyZQ0KICBGSUZPIGlzIGZpbGxlZCB1c2luZyBvbmUgRE1BIGNoYW5uZWwgYW5kIGEgc2Vjb25kIERNQSBjaGFubmVsIGlzIHVzZWQgdG8gcmVhZA0KICB0aGUgY29udGVudCBvZiB0aGUgTVNTIFNQSSByZWNlaXZlIGhhcmR3YXJlIEZJRk8uIFRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZQ0KICBidWZmZXJzIGFyZSBzcGVjaWZpZWQgYnkgdHdvIHNlcGFyYXRlIGNhbGxzIHRvIFBETUFfc3RhcnQoKSB0byBpbml0aWF0ZSBETUENCiAgdHJhbnNmZXJzIG9uIHRoZSBjaGFubmVsIHVzZWQgZm9yIHRyYW5zbWl0IGRhdGEgYW5kIHRoZSBjaGFubmVsIHVzZWQgZm9yDQogIHJlY2VpdmUgZGF0YS4gDQogIEBjb2RlDQogICAgICB1aW50OF90IG1hc3Rlcl90eF9idWZmZXJbTUFTVEVSX1JYX0JVRkZFUl0gPQ0KICAgICAgew0KICAgICAgICAgIDB4QzEsIDB4QzIsIDB4QzMsIDB4QzQsIDB4QzUsIDB4QzYsIDB4QzcsIDB4QzgsIDB4QzksIDB4Q0ENCiAgICAgIH07DQogICAgICB1aW50OF90IHNsYXZlX3J4X2J1ZmZlcltNQVNURVJfUlhfQlVGRkVSXSA9IA0KICAgICAgew0KICAgICAgICAgIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MEENCiAgICAgIH07DQogICAgICBNU1NfU1BJX2luaXQoICZnX21zc19zcGkwICk7DQoNCiAgICAgIE1TU19TUElfY29uZmlndXJlX21hc3Rlcl9tb2RlDQogICAgICAgICAgKA0KICAgICAgICAgICAgJmdfbXNzX3NwaTAsDQogICAgICAgICAgICBNU1NfU1BJX1NMQVZFXzAsDQogICAgICAgICAgICBNU1NfU1BJX01PREUxLA0KICAgICAgICAgICAgTVNTX1NQSV9QQ0xLX0RJVl8yNTYsDQogICAgICAgICAgICBNU1NfU1BJX0JMT0NLX1RSQU5TRkVSX0ZSQU1FX1NJWkUNCiAgICAgICAgICk7DQogICAgICBNU1NfU1BJX3NldF9zbGF2ZV9zZWxlY3QoICZnX21zc19zcGkwLCBNU1NfU1BJX1NMQVZFXzAgKTsNCiAgICAgIE1TU19TUElfdHJhbnNmZXJfYmxvY2soICZnX21zc19zcGkwLCAwLCAwLCAwLCAwICk7DQogICAgICBQRE1BX3N0YXJ0DQogICAgICAgICgNCiAgICAgICAgICAgIFBETUFfQ0hBTk5FTF8xLA0KICAgICAgICAgICAgUERNQV9TUEkwX1JYX1JFR0lTVEVSLA0KICAgICAgICAgICAgKHVpbnQzMl90KW1hc3Rlcl9yeF9idWZmZXIsDQogICAgICAgICAgICBzaXplb2YobWFzdGVyX3J4X2J1ZmZlcikNCiAgICAgICAgKTsgDQogICAgICBQRE1BX3N0YXJ0DQogICAgICAgICgNCiAgICAgICAgICAgIFBETUFfQ0hBTk5FTF8yLA0KICAgICAgICAgICAgKHVpbnQzMl90KW1hc3Rlcl90eF9idWZmZXIsDQogICAgICAgICAgICBQRE1BX1NQSTBfVFhfUkVHSVNURVIsDQogICAgICAgICAgICBzaXplb2YobWFzdGVyX3R4X2J1ZmZlcikNCiAgICAgICAgKTsgDQogICAgICB3aGlsZSggUERNQV9zdGF0dXMoUERNQV9DSEFOTkVMXzEpID09IDAgKQ0KICAgICAgew0KICAgICAgICAgIDsNCiAgICAgIH0NCiAgICAgIE1TU19TUElfY2xlYXJfc2xhdmVfc2VsZWN0KCAmZ19tc3Nfc3BpMCwgTVNTX1NQSV9TTEFWRV8wICk7DQogIEBlbmRjb2RlDQogKi8NCnZvaWQgTVNTX1NQSV90cmFuc2Zlcl9ibG9jaw0KKA0KICAgIG1zc19zcGlfaW5zdGFuY2VfdCAqIHRoaXNfc3BpLA0KICAgIGNvbnN0IHVpbnQ4X3QgKiBjbWRfYnVmZmVyLA0KICAgIHVpbnQxNl90IGNtZF9ieXRlX3NpemUsDQogICAgdWludDhfdCAqIHJkX2J1ZmZlciwNCiAgICB1aW50MTZfdCByZF9ieXRlX3NpemUNCik7DQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogKiBTbGF2ZSBmdW5jdGlvbnMNCiAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBNU1NfU1BJX3NldF9mcmFtZV9yeF9oYW5kbGVyKCkgZnVuY3Rpb24gaXMgdXNlZCBieSBNU1MgU1BJIHNsYXZlcyB0bw0KICBzcGVjaWZ5IHRoZSByZWNlaXZlIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBieSB0aGUgTVNTIFNQSSBkcml2ZXINCiAgaW50ZXJydXB0IGhhbmRsZXIgd2hlbiBhIGEgZnJhbWUgb2YgZGF0YSBpcyByZWNlaXZlZCBieSB0aGUgTVNTIFNQSSBzbGF2ZS4NCiAgDQogIEBwYXJhbSB0aGlzX3NwaQ0KICAgIFRoZSB0aGlzX3NwaSBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIG1zc19zcGlfaW5zdGFuY2VfdCBzdHJ1Y3R1cmUNCiAgICBpZGVudGlmeWluZyB0aGUgTVNTIFNQSSBoYXJkd2FyZSBibG9jayB0byBiZSBpbml0aWFsaXplZC4gVGhlcmUgYXJlIHR3byBzdWNoDQogICAgZGF0YSBzdHJ1Y3R1cmVzLCBnX21zc19zcGkwIGFuZCBnX21zc19zcGkxLCBhc3NvY2lhdGVkIHdpdGggTVNTIFNQSSAwIGFuZA0KICAgIE1TUyBTUEkgMSByZXNwZWN0aXZlbHkuIFRoaXMgcGFyYW1ldGVyIG11c3QgcG9pbnQgdG8gZWl0aGVyIHRoZSBnX21zc19zcGkwDQogICAgb3IgZ19tc3Nfc3BpMSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5lZCB3aXRoaW4gdGhlIFNQSSBkcml2ZXIuDQogICAgDQogDQogIEBwYXJhbSByeF9oYW5kbGVyDQogICAgVGhlIHJ4X2hhbmRsZXIgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byB0aGUgZnJhbWUgcmVjZWl2ZSBoYW5kbGVyIHRoYXQgbXVzdA0KICAgIGJlIGNhbGxlZCB3aGVuIGEgZnJhbWUgaXMgcmVjZWl2ZWQgYnkgdGhlIE1TUyBTUEkgc2xhdmUuDQogDQogIEV4YW1wbGU6DQogIEBjb2RlDQogICAgICB1aW50MzJfdCBnX3NsYXZlX3J4X2ZyYW1lID0gMDsNCg0KICAgICAgdm9pZCBzbGF2ZV9mcmFtZV9oYW5kbGVyKCB1aW50MzJfdCByeF9mcmFtZSApDQogICAgICB7DQogICAgICAgICAgZ19zbGF2ZV9yeF9mcmFtZSA9IHJ4X2ZyYW1lOw0KICAgICAgfQ0KDQogICAgICBpbnQgc2V0dXBfc2xhdmUoIHZvaWQgKQ0KICAgICAgew0KICAgICAgICAgIGNvbnN0IHVpbnQxNl90IGZyYW1lX3NpemUgPSAyNTsNCiAgICAgICAgICBNU1NfU1BJX2luaXQoICZnX21zc19zcGkxICk7DQogICAgICAgICAgTVNTX1NQSV9jb25maWd1cmVfc2xhdmVfbW9kZQ0KICAgICAgICAgICAgKA0KICAgICAgICAgICAgICAgICZnX21zc19zcGkwLA0KICAgICAgICAgICAgICAgIE1TU19TUElfTU9ERTIsDQogICAgICAgICAgICAgICAgTVNTX1NQSV9QQ0xLX0RJVl82NCwNCiAgICAgICAgICAgICAgICBmcmFtZV9zaXplDQogICAgICAgICAgICApOw0KICAgICAgICAgIE1TU19TUElfc2V0X2ZyYW1lX3J4X2hhbmRsZXIoICZnX21zc19zcGkxLCBzbGF2ZV9mcmFtZV9oYW5kbGVyICk7DQogICAgICB9DQogIEBlbmRjb2RlDQogKi8NCnZvaWQgTVNTX1NQSV9zZXRfZnJhbWVfcnhfaGFuZGxlcg0KKA0KICAgIG1zc19zcGlfaW5zdGFuY2VfdCAqIHRoaXNfc3BpLA0KICAgIG1zc19zcGlfZnJhbWVfcnhfaGFuZGxlcl90IHJ4X2hhbmRsZXINCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBNU1NfU1BJX3NldF9zbGF2ZV90eF9mcmFtZSgpIGZ1bmN0aW9uIGlzIHVzZWQgYnkgTVNTIFNQSSBzbGF2ZXMgdG8gc3BlY2lmeQ0KICB0aGUgZnJhbWUgdGhhdCB3aWxsIGJlIHRyYW5zbWl0dGVkIHdoZW4gYSB0cmFuc2FjdGlvbiBpcyBpbml0aWF0ZWQgYnkgdGhlIFNQSQ0KICBtYXN0ZXIuDQogIA0KICBAcGFyYW0gdGhpc19zcGkNCiAgICBUaGUgdGhpc19zcGkgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBtc3Nfc3BpX2luc3RhbmNlX3Qgc3RydWN0dXJlDQogICAgaWRlbnRpZnlpbmcgdGhlIE1TUyBTUEkgaGFyZHdhcmUgYmxvY2sgdG8gYmUgaW5pdGlhbGl6ZWQuIFRoZXJlIGFyZSB0d28gc3VjaA0KICAgIGRhdGEgc3RydWN0dXJlcywgZ19tc3Nfc3BpMCBhbmQgZ19tc3Nfc3BpMSwgYXNzb2NpYXRlZCB3aXRoIE1TUyBTUEkgMCBhbmQNCiAgICBNU1MgU1BJIDEgcmVzcGVjdGl2ZWx5LiBUaGlzIHBhcmFtZXRlciBtdXN0IHBvaW50IHRvIGVpdGhlciB0aGUgZ19tc3Nfc3BpMA0KICAgIG9yIGdfbXNzX3NwaTEgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIGRlZmluZWQgd2l0aGluIHRoZSBTUEkgZHJpdmVyLg0KICAgIA0KIA0KICBAcGFyYW0gZnJhbWVfdmFsdWUNCiAgICBUaGUgZnJhbWVfdmFsdWUgcGFyYW1ldGVyIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgZnJhbWUgdG8gYmUgc2VudCB0byB0aGUNCiAgICBtYXN0ZXIuDQogICAgTm90ZTogICBUaGUgYml0IGxlbmd0aCBvZiB0aGUgdmFsdWUgdG8gYmUgdHJhbnNtaXR0ZWQgdG8gdGhlIG1hc3RlciBtdXN0IGJlDQogICAgICAgICAgICBzcGVjaWZpZWQgYXMgdGhlIGZyYW1lX2JpdF9sZW5ndGggcGFyYW1ldGVyIGluIGEgcHJldmlvdXMgY2FsbCB0bw0KICAgICAgICAgICAgdGhlIE1TU19TUElfY29uZmlndXJlX3NsYXZlKCkgZnVuY3Rpb24uDQoNCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICAgIGNvbnN0IHVpbnQxNl90IGZyYW1lX3NpemUgPSAyNTsNCiAgICAgIGNvbnN0IHVpbnQzMl90IHNsYXZlX3R4X2ZyYW1lID0gMHgwMTEwRjc2MTsNCiAgICAgIHVpbnQzMl90IG1hc3Rlcl9yeDsNCg0KICAgICAgTVNTX1NQSV9pbml0KCAmZ19tc3Nfc3BpMSApOw0KICAgICAgTVNTX1NQSV9jb25maWd1cmVfc2xhdmVfbW9kZQ0KICAgICAgICAoDQogICAgICAgICAgICAmZ19tc3Nfc3BpMCwNCiAgICAgICAgICAgIE1TU19TUElfTU9ERTIsDQogICAgICAgICAgICBNU1NfU1BJX1BDTEtfRElWXzY0LA0KICAgICAgICAgICAgZnJhbWVfc2l6ZQ0KICAgICAgICApOw0KICAgICAgTVNTX1NQSV9zZXRfc2xhdmVfdHhfZnJhbWUoICZnX21zc19zcGkxLCBzbGF2ZV90eF9mcmFtZSApOw0KICBAZW5kY29kZQ0KICovDQp2b2lkIE1TU19TUElfc2V0X3NsYXZlX3R4X2ZyYW1lDQooDQogICAgbXNzX3NwaV9pbnN0YW5jZV90ICogdGhpc19zcGksDQogICAgdWludDMyX3QgZnJhbWVfdmFsdWUNCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBNU1NfU1BJX3NldF9zbGF2ZV9ibG9ja19idWZmZXJzKCkgZnVuY3Rpb24gaXMgdXNlZCB0byBjb25maWd1cmUgYW4gTVNTDQogIFNQSSBzbGF2ZSBmb3IgYmxvY2sgdHJhbnNmZXIgb3BlcmF0aW9ucy4gSXQgc3BlY2lmaWVzIG9uZSBvciBtb3JlIG9mIHRoZQ0KICBmb2xsb3dpbmc6DQogICAglSBUaGUgZGF0YSB0aGF0IHdpbGwgYmUgdHJhbnNtaXR0ZWQgd2hlbiBhY2Nlc3NlZCBieSBhIG1hc3Rlci4NCiAgICCVIFRoZSBidWZmZXIgd2hlcmUgZGF0YSByZWNlaXZlZCBmcm9tIGEgbWFzdGVyIHdpbGwgYmUgc3RvcmVkLg0KICAgIJUgVGhlIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgcmVjZWl2ZSBidWZmZXIgaGFzIGJlZW4NCiAgICAgIGZpbGxlZC4NCiAgICCVIFRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtdXN0IGJlIHJlY2VpdmVkIGZyb20gdGhlIG1hc3RlciBiZWZvcmUgdGhlIHJlY2VpdmUNCiAgICAgIGhhbmRsZXIgZnVuY3Rpb24gaXMgY2FsbGVkLg0KICBUaGVzZSBwYXJhbWV0ZXJzIGFsbG93IHRoZSBmb2xsb3dpbmcgdXNlIGNhc2VzOg0KICAgIJUgU2xhdmUgcGVyZm9ybWluZyBhbiBhY3Rpb24gYWZ0ZXIgcmVjZWl2aW5nIGEgYmxvY2sgb2YgZGF0YSBmcm9tIGEgbWFzdGVyDQogICAgICBjb250YWluaW5nIGEgY29tbWFuZC4gVGhlIGFjdGlvbiB3aWxsIGJlIHBlcmZvcm1lZCBieSB0aGUgcmVjZWl2ZSBoYW5kbGluZw0KICAgICAgYmFzZWQgb24gdGhlIGNvbnRlbnQgb2YgdGhlIHJlY2VpdmUgZGF0YSBidWZmZXIuDQogICAglSBTbGF2ZSByZXR1cm5pbmcgYSBibG9jayBvZiBkYXRhIHRvIHRoZSBtYXN0ZXIuIFRoZSB0eXBlIG9mIGluZm9ybWF0aW9uIGlzDQogICAgICBhbHdheXMgdGhlIHNhbWUgYnV0IHRoZSBhY3R1YWwgdmFsdWVzIGNoYW5nZSBvdmVyIHRpbWUuIEZvciBleGFtcGxlLA0KICAgICAgcmV0dXJuaW5nIHRoZSB2b2x0YWdlIG9mIGEgcHJlZGVmaW5lZCBzZXQgb2YgYW5hbG9nIGlucHV0cy4NCiAgICCVIFNsYXZlIHJldHVybmluZyBkYXRhIGJhc2VkIG9uIGEgY29tbWFuZCBjb250YWluZWQgaW4gdGhlIGZpcnN0IHBhcnQgb2YgdGhlDQogICAgICBTUEkgdHJhbnNhY3Rpb24uIEZvciBleGFtcGxlLCByZWFkaW5nIHRoZSB2b2x0YWdlIG9mIHRoZSBhbmFsb2cgaW5wdXQNCiAgICAgIHNwZWNpZmllZCBieSB0aGUgZmlyc3QgZGF0YSBieXRlIGJ5IHRoZSBtYXN0ZXIuIFRoaXMgaXMgYWNoaWV2ZWQgYnkgc2V0dGluZw0KICAgICAgdGhlIHJ4X2J1ZmZfc2l6ZSBwYXJhbWV0ZXIgdG8gdGhlIG51bWJlciBvZiByZWNlaXZlZCBieXRlcyBtYWtpbmcgdXAgdGhlDQogICAgICBjb21tYW5kLg0KICANCiAgQHBhcmFtIHRoaXNfc3BpDQogICAgVGhlIHRoaXNfc3BpIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gbXNzX3NwaV9pbnN0YW5jZV90IHN0cnVjdHVyZQ0KICAgIGlkZW50aWZ5aW5nIHRoZSBNU1MgU1BJIGhhcmR3YXJlIGJsb2NrIHRvIGJlIGluaXRpYWxpemVkLiBUaGVyZSBhcmUgdHdvIHN1Y2gNCiAgICBkYXRhIHN0cnVjdHVyZXMsIGdfbXNzX3NwaTAgYW5kIGdfbXNzX3NwaTEsIGFzc29jaWF0ZWQgd2l0aCBNU1MgU1BJIDAgYW5kDQogICAgTVNTIFNQSSAxIHJlc3BlY3RpdmVseS4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBlaXRoZXIgdGhlIGdfbXNzX3NwaTANCiAgICBvciBnX21zc19zcGkxIGdsb2JhbCBkYXRhIHN0cnVjdHVyZSBkZWZpbmVkIHdpdGhpbiB0aGUgU1BJIGRyaXZlci4NCiAgICANCiANCiAgQHBhcmFtIHR4X2J1ZmZlcg0KICAgIFRoZSB0eF9idWZmZXIgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIHRoYXQNCiAgICB3aWxsIGJlIHNlbnQgdG8gdGhlIG1hc3Rlci4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byAwIGlmIHRoZSBNU1MgU1BJDQogICAgc2xhdmUgaXMgbm90IGludGVuZGVkIHRvIGJlIHRoZSB0YXJnZXQgb2YgU1BJIHJlYWQgdHJhbnNhY3Rpb25zIG9yIGlmIERNQQ0KICAgIGlzIHVzZWQgdG8gdHJhbnNmZXIgU1BJIHJlYWQgZGF0YSBpbnRvIHRoZSBNU1MgU1BJIHNsYXZlLg0KIA0KICBAcGFyYW0gdHhfYnVmZl9zaXplDQogICAgVGhlIHR4X2J1ZmZfc2l6ZSBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29udGFpbmVkIGluIHRoZQ0KICAgIHR4X2J1ZmZlci4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byAwIGlmIHRoZSBNU1MgU1BJIHNsYXZlIGlzIG5vdA0KICAgIGludGVuZGVkIHRvIGJlIHRoZSB0YXJnZXQgb2YgU1BJIHJlYWQgdHJhbnNhY3Rpb25zIG9yIGlmIERNQSBpcyB1c2VkIHRvDQogICAgdHJhbnNmZXIgU1BJIHJlYWQgZGF0YSBpbnRvIHRoZSBNU1MgU1BJIHNsYXZlLg0KIA0KICBAcGFyYW0gcnhfYnVmZmVyDQogICAgVGhlIHJ4X2J1ZmZlciBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIHRoZSBidWZmZXIgd2hlcmUgZGF0YSByZWNlaXZlZCBmcm9tDQogICAgdGhlIG1hc3RlciB3aWxsIGJlIHN0b3JlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byAwIGlmIHRoZSBNU1MgU1BJDQogICAgc2xhdmUgaXMgbm90IGludGVuZGVkIHRvIGJlIHRoZSB0YXJnZXQgb2YgU1BJIHdyaXRlIG9yIHdyaXRlLXJlYWQNCiAgICB0cmFuc2FjdGlvbnMuIEl0IGNhbiBhbHNvIHNldCB0byAwIGlmIHRoZSBNU1MgU1BJIHNsYXZlIHVzZXMgRE1BIHRvIGhhbmRsZQ0KICAgIGRhdGEgd3JpdHRlbiB0byBpdC4NCiANCiAgQHBhcmFtIHJ4X2J1ZmZfc2l6ZQ0KICAgIFRoZSByeF9idWZmX3NpemUgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgcmVjZWl2ZSBidWZmZXIuIEl0IGlzDQogICAgYWxzbyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbXVzdCBiZSByZWNlaXZlZCBiZWZvcmUgdGhlIHJlY2VpdmUgaGFuZGxlcg0KICAgIGlzIGNhbGxlZCwgaWYgYSByZWNlaXZlIGhhbmRsZXIgaXMgc3BlY2lmaWVkIHVzaW5nIHRoZSBibG9ja19yeF9oYW5kbGVyDQogICAgcGFyYW1ldGVyLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgc2V0IHRvIDAgaWYgdGhlIE1TUyBTUEkgc2xhdmUgaXMgbm90DQogICAgaW50ZW5kZWQgdG8gYmUgdGhlIHRhcmdldCBvZiBTUEkgd3JpdGUgb3Igd3JpdGUtcmVhZCB0cmFuc2FjdGlvbnMuIEl0IGNhbg0KICAgIGFsc28gc2V0IHRvIDAgaWYgdGhlIE1TUyBTUEkgc2xhdmUgdXNlcyBETUEgdG8gaGFuZGxlIGRhdGEgd3JpdHRlbiB0byBpdC4NCiANCiAgQHBhcmFtIGJsb2NrX3J4X2hhbmRsZXINCiAgICBUaGUgYmxvY2tfcnhfaGFuZGxlciBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlDQogICAgY2FsbGVkIHdoZW4gdGhlIHJlY2VpdmUgYnVmZmVyIGhhcyBiZWVuIGZpbGxlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldA0KICAgIHRvIDAgaWYgdGhlIE1TUyBTUEkgc2xhdmUgaXMgbm90IGludGVuZGVkIHRvIGJlIHRoZSB0YXJnZXQgb2YgU1BJIHdyaXRlIG9yDQogICAgd3JpdGUtcmVhZCB0cmFuc2FjdGlvbnMuIEl0IGNhbiBhbHNvIHNldCB0byAwIGlmIHRoZSBNU1MgU1BJIHNsYXZlIHVzZXMgRE1BDQogICAgdG8gaGFuZGxlIGRhdGEgd3JpdHRlbiB0byBpdC4NCiANCiAgU2xhdmUgcGVyZm9ybWluZyBvcGVyYXRpb24gYmFzZWQgb24gbWFzdGVyIGNvbW1hbmQ6DQogIEluIHRoaXMgZXhhbXBsZSB0aGUgU1BJIHNsYXZlIGlzIGNvbmZpZ3VyZWQgdG8gcmVjZWl2ZSAxMCBieXRlcyBvZiBkYXRhIG9yDQogIGNvbW1hbmQgZnJvbSB0aGUgU1BJIHNsYXZlIGFuZCBwcm9jZXNzIHRoZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIG1hc3Rlci4NCiAgQGNvZGUNCiAgICAgdWludDMyX3QgbmJfb2ZfcnhfaGFuZGxlcl9jYWxscyA9IDA7DQogICAgIA0KICAgICB2b2lkIHNwaTFfYmxvY2tfcnhfaGFuZGxlcl9iDQogICAgICgNCiAgICAgICAgIHVpbnQ4X3QgKiByeF9idWZmLA0KICAgICAgICAgdWludDE2X3Qgcnhfc2l6ZQ0KICAgICApDQogICAgIHsNCiAgICAgICAgICsrbmJfb2ZfcnhfaGFuZGxlcl9jYWxsczsNCiAgICAgfQ0KICAgICANCiAgICAgdm9pZCBzZXR1cF9zbGF2ZSggdm9pZCApDQogICAgIHsNCiAgICAgICAgIHVpbnQ4X3Qgc2xhdmVfcnhfYnVmZmVyWzEwXSA9IA0KICAgICAgICAgew0KICAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDANCiAgICAgICAgIH07DQogICAgICAgICANCiAgICAgICAgIE1TU19TUElfaW5pdCggJmdfbXNzX3NwaTEgKTsNCiAgICAgICAgIE1TU19TUElfY29uZmlndXJlX3NsYXZlX21vZGUNCiAgICAgICAgICAgICggDQogICAgICAgICAgICAgICAgJmdfbXNzX3NwaTAsDQogICAgICAgICAgICAgICAgTVNTX1NQSV9NT0RFMiwNCiAgICAgICAgICAgICAgICBNU1NfU1BJX1BDTEtfRElWXzY0LA0KICAgICAgICAgICAgICAgIE1TU19TUElfQkxPQ0tfVFJBTlNGRVJfRlJBTUVfU0laRQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgIA0KICAgICAgICAgTVNTX1NQSV9zZXRfc2xhdmVfYmxvY2tfYnVmZmVycw0KICAgICAgICAgICAgICgNCiAgICAgICAgICAgICAgICAgJmdfbXNzX3NwaTEsDQogICAgICAgICAgICAgICAgIDAsDQogICAgICAgICAgICAgICAgIDAsDQogICAgICAgICAgICAgICAgIHNsYXZlX3J4X2J1ZmZlciwNCiAgICAgICAgICAgICAgICAgc2l6ZW9mKG1hc3Rlcl90eF9idWZmZXIpLA0KICAgICAgICAgICAgICAgICBzcGkxX2Jsb2NrX3J4X2hhbmRsZXJfYg0KICAgICAgICAgICAgICk7DQogICAgIH0NCiAgQGVuZGNvZGUNCiAgDQogIFNsYXZlIHJlc3BvbmRpbmcgdG8gY29tbWFuZCBleGFtcGxlOg0KICBJbiB0aGlzIGV4YW1wbGUgdGhlIHNsYXZlIHdpbGwgcmV0dXJuIGRhdGEgYmFzZWQgb24gYSBjb21tYW5kIHNlbnQgYnkgdGhlDQogIG1hc3Rlci4gVGhlIGZpcnN0IHBhcnQgb2YgdGhlIHRyYW5zYWN0aW9uIGlzIGhhbmRsZWQgdXNpbmcgcG9sbGVkIG1vZGUgd2hlcmUNCiAgZWFjaCBieXRlIHJldHVybmVkIHRvIHRoZSBtYXN0ZXIgaXMgd3JpdHRlbiBhcyBwYXJ0IG9mIHRoZSBpbnRlcnJ1cHQgc2VydmljZQ0KICByb3V0aW5lLiBUaGUgc2Vjb25kIHBhcnQgb2YgdGhlIHRyYW5zYWN0aW9uLCB3aGVyZSB0aGUgc2xhdmUgcmV0dXJucyBkYXRhDQogIGJhc2VkIG9uIHRoZSBjb21tYW5kIHZhbHVlLCBpcyBzZW50IHVzaW5nIGEgRE1BIHRyYW5zZmVyIGluaXRpYXRlZCBieSB0aGUNCiAgcmVjZWl2ZSBoYW5kbGVyLiANCiAgQGNvZGUNCiAgICAgc3RhdGljIHVpbnQ4X3QgZ19zcGkxX3R4X2J1ZmZlcl9iW1NMQVZFX1RYX0JVRkZFUl9TSVpFXSA9DQogICAgIHsNCiAgICAgICAgIDUsIDYsIDcsIDgsIDB4QTAsIDB4QTEsIDB4QTIsIDB4QTMsIDB4QTQsIDB4QTUNCiAgICAgfTsNCiAgICAgDQogICAgIHZvaWQgc3BpMV9ibG9ja19yeF9oYW5kbGVyDQogICAgICgNCiAgICAgICAgIHVpbnQ4X3QgKiByeF9idWZmLA0KICAgICAgICAgdWludDE2X3Qgcnhfc2l6ZQ0KICAgICApDQogICAgIHsNCiAgICAgICAgIGlmICggcnhfYnVmZlsyXSA9PSAweDk5ICkNCiAgICAgICAgIHsNCiAgICAgICAgICAgICBQRE1BX3N0YXJ0DQogICAgICAgICAgICAgKA0KICAgICAgICAgICAgICAgICBQRE1BX0NIQU5ORUxfMCwNCiAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWdfc3BpMV90eF9idWZmZXJfYiwNCiAgICAgICAgICAgICAgICAgMHg0MDAxMTAxNCwNCiAgICAgICAgICAgICAgICAgc2l6ZW9mKGdfc3BpMV90eF9idWZmZXJfYikNCiAgICAgICAgICAgICApOyAgICAgIA0KICAgICAgICAgfQ0KICAgICB9DQogICAgIA0KICAgICB2b2lkIHNldHVwX3NsYXZlKCB2b2lkICkNCiAgICAgew0KICAgICAgICAgdWludDhfdCBzbGF2ZV9wcmVhbWJsZVs4XSA9IHsgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNiwgMTYgfTsNCg0KICAgICAgICAgTVNTX1NQSV9pbml0KCAmZ19tc3Nfc3BpMSApOw0KICAgICAgICAgTVNTX1NQSV9jb25maWd1cmVfc2xhdmVfbW9kZQ0KICAgICAgICAgICAgKA0KICAgICAgICAgICAgICAgICZnX21zc19zcGkwLA0KICAgICAgICAgICAgICAgIE1TU19TUElfTU9ERTIsDQogICAgICAgICAgICAgICAgTVNTX1NQSV9QQ0xLX0RJVl82NCwNCiAgICAgICAgICAgICAgICBNU1NfU1BJX0JMT0NLX1RSQU5TRkVSX0ZSQU1FX1NJWkUNCiAgICAgICAgKTsNCiAgICAgICAgIA0KICAgICAgICAgUERNQV9pbml0KCk7DQogICAgICAgICBQRE1BX2NvbmZpZ3VyZQ0KICAgICAgICAgICAgICAoDQogICAgICAgICAgICAgICAgICBQRE1BX0NIQU5ORUxfMCwgDQogICAgICAgICAgICAgICAgICBUT19TUElfMSwNCiAgICAgICAgICAgICAgICAgIExPV19QUklPUklUWSB8IEJZVEVfVFJBTlNGRVIgfCBJTkNfU1JDX09ORV9CWVRFDQogICAgICAgICAgICAgICk7DQogICAgIA0KICAgICAgICAgTVNTX1NQSV9zZXRfc2xhdmVfYmxvY2tfYnVmZmVycw0KICAgICAgICAgICAgICgNCiAgICAgICAgICAgICAgICAgJmdfbXNzX3NwaTEsDQogICAgICAgICAgICAgICAgIHNsYXZlX3ByZWFtYmxlLA0KICAgICAgICAgICAgICAgICA0LA0KICAgICAgICAgICAgICAgICBnX3NwaTFfcnhfYnVmZmVyLA0KICAgICAgICAgICAgICAgICBzaXplb2YoZ19zcGkxX3J4X2J1ZmZlciksDQogICAgICAgICAgICAgICAgIHNwaTFfYmxvY2tfcnhfaGFuZGxlcg0KICAgICAgICAgICAgICk7DQogICAgIH0NCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZCBNU1NfU1BJX3NldF9zbGF2ZV9ibG9ja19idWZmZXJzDQooDQogICAgbXNzX3NwaV9pbnN0YW5jZV90ICogdGhpc19zcGksDQogICAgY29uc3QgdWludDhfdCAqIHR4X2J1ZmZlciwNCiAgICB1aW50MzJfdCB0eF9idWZmX3NpemUsDQogICAgdWludDhfdCAqIHJ4X2J1ZmZlciwNCiAgICB1aW50MzJfdCByeF9idWZmX3NpemUsDQogICAgbXNzX3NwaV9ibG9ja19yeF9oYW5kbGVyX3QgYmxvY2tfcnhfaGFuZGxlcg0KKTsNCg0KI2lmZGVmIF9fY3BsdXNwbHVzDQp9DQojZW5kaWYNCg0KI2VuZGlmIC8qIE1TU19TUElfSF8qLw0K