LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIChjKSBDb3B5cmlnaHQgMjAwOSBBY3RlbCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQogKg0KICogU21hcnRGdXNpb24gQUNFIGRyaXZlciBwdWJsaWMgQVBJLg0KICoNCiAqIFNWTiAkUmV2aXNpb246IDI4ODQgJA0KICogU1ZOICREYXRlOiAyMDEwLTA4LTEzIDE2OjE2OjU5ICswMTAwIChGcmksIDEzIEF1ZyAyMDEwKSAkDQogKi8NCg0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8vKioNCiAgQG1haW5wYWdlIFNtYXJ0RnVzaW9uIEFuYWxvZyBDb21wdXRlIEVuZ2luZSBkcml2ZXIgcHVibGljIEFQSS4NCg0KICBAc2VjdGlvbiBpbnRyb19zZWMgSW50cm9kdWN0aW9uDQogIFRoZSBTbWFydEZ1c2lvbpkgbWljcm9jb250cm9sbGVyIHN1YnN5c3RlbSAoTVNTKSBpbmNsdWRlcyB0aGUgQW5hbG9nIENvbXB1dGUNCiAgRW5naW5lIChBQ0UpIHdoaWNoIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgYW5hbG9nIGNhcGFiaWxpdGllcyBvZiBTbWFydEZ1c2lvbg0KICBmcm9tIHRoZSBDb3J0ZXiZLU0zIG1pY3JvY29udHJvbGxlci4gVGhpcyBkcml2ZXIgcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zDQogIGZvciBjb250cm9sbGluZyB0aGUgTVNTIEFDRSBhcyBwYXJ0IG9mIGEgYmFyZSBtZXRhbCBzeXN0ZW0gd2hlcmUgbm8gb3BlcmF0aW5nDQogIHN5c3RlbSBpcyBhdmFpbGFibGUuIFRoZXNlIGRyaXZlcnMgY2FuIGJlIGFkYXB0ZWQgZm9yIHVzZSBhcyBwYXJ0IG9mIGFuDQogIG9wZXJhdGluZyBzeXN0ZW0sIGJ1dCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGFkYXB0YXRpb24gbGF5ZXIgYmV0d2VlbiB0aGlzDQogIGRyaXZlciBhbmQgdGhlIG9wZXJhdGluZyBzeXN0ZW0ncyBkcml2ZXIgbW9kZWwgaXMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcw0KICBkcml2ZXIuIFRoZSBBQ0UgaW5jbHVkZXM6DQogICAglSBBIFNhbXBsZSBTZXF1ZW5jaW5nIEVuZ2luZSAoU1NFKSBjb250cm9sbGluZyB0aGUgIG9wZXJhdGlvbnMgb2YgdXAgdG8NCiAgICAgIHRocmVlIGFuYWxvZyB0byBkaWdpdGFsIGNvbnZlcnRlcnMgKEFEQykNCiAgICCVIEEgUG9zdCBQcm9jZXNzaW5nIEVuZ2luZSAoUFBFKSBwcm9jZXNzaW5nIHRoZSBhbmFsb2cgaW5wdXRzIHNhbXBsZXMNCiAgICAgIGdlbmVyYXRlZCBhcyBhIHJlc3VsdCBvZiB0aGUgU1NFIG9wZXJhdGlvbnMNCiAgICCVIEFuIGludGVyZmFjZSBmb3IgY29udHJvbGxpbmcgU2lnbWEgRGVsdGEgREFDcyAoU0REKQ0KICAgIJUgQW4gaW50ZXJmYWNlIGZvciBjb250cm9sbGluZyBoaWdoIHNwZWVkIGNvbXBhcmF0b3JzDQoNCiAgVGhlIFNhbXBsZSBTZXF1ZW5jaW5nIEVuZ2luZSBjb250cm9scyB0aGUgc2FtcGxpbmcgb2YgdGhlIHZhcmlvdXMgYW5hbG9nDQogIGlucHV0cyBiYXNlZCBvbiBhIHByZWRlZmluZWQgc2FtcGxpbmcgc2VxdWVuY2Ugd2l0aG91dCByZXF1aXJpbmcgaW50ZXJ2ZW50aW9uDQogIGZyb20gdGhlIENvcnRleC1NMy4gVGhlIHNhbXBsaW5nIHNlcXVlbmNlIGlzIGRlZmluZWQgdXNpbmcgdGhlIEFDRSBDb25maWd1cmF0b3INCiAgcHJvdmlkZWQgYXMgcGFydCBvZiB0aGUgTVNTIENvbmZpZ3VyYXRvciBzb2Z0d2FyZSB0b29sLg0KICBBdmFpbGFibGUgYW5hbG9nIGlucHV0cyBhcmU6DQogICAglSBBY3RpdmUgYmlwb2xhciBwcmVzY2FsZXIgaW5wdXRzIChBQlBTKSBhbGxvd2luZyB0byBtZWFzdXJlIHZvbHRhZ2VzIHdpdGhpbg0KICAgICAgZm91ciBwb3NzaWJsZSByYW5nZXM6DQogICAgICAgIG8gLTE1ViB0byArMTVWDQogICAgICAgIG8gLTEwViB0byArMTBWDQogICAgICAgIG8gLTVWIHRvICs1Vg0KICAgICAgICBvIC0yLjVWIHRvICsyLjVWDQogICAglSBDdXJyZW50IGlucHV0cw0KICAgIJUgVGVtcGVyYXR1cmUgaW5wdXRzDQogICAglSBEaXJlY3QgQURDIGlucHV0cyBhbGxvd2luZyB0byBtZWFzdXJlIGEgdm9sdGFnZSBiZXR3ZWVuIHplcm8gdm9sdHMgYW5kDQogICAgICB0aGUgQURDknMgcmVmZXJlbmNlIHZvbHRhZ2UgKFZBUkVGKQ0KICBQbGVhc2UgcmVmZXIgdG8gdGhlIEFuYWxvZyBGcm9udCBFbmQgc2VjdGlvbiBvZiB0aGUgU21hcnRGdXNpb24gZGF0YXNoZWV0IGZvcg0KICBmdXJ0aGVyIGRldGFpbHMgYWJvdXQgYW5hbG9nIGlucHV0cy4NCg0KICBUaGUgUG9zdCBQcm9jZXNzaW5nIEVuZ2luZSBjYW4gcGVyZm9ybSB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgb24gdGhlIGFuYWxvZw0KICBpbnB1dCBzYW1wbGVzIGdlbmVyYXRlZCBhcyBhIHJlc3VsdCBvZiB0aGUgU1NFIG9wZXJhdGlvbnM6DQogICAglSBDYWxpYnJhdGlvbiBhZGp1c3RtZW50DQogICAglSBBdmVyYWdpbmcNCiAgICCVIFRocmVzaG9sZCBkZXRlY3Rpb24NCiAgICCVIERNQSB0cmFuc2ZlciBvZiBtb3N0IHJlY2VudCBzYW1wbGUgcmVzdWx0IHRvIFJBTSBvciBGUEdBIGZhYnJpYw0KICBUaGUgcmVzdWx0IG9mIGFuYWxvZyBpbnB1dCBzYW1wbGluZyBpcyByZWFkIGZyb20gdGhlIFBQRSByYXRoZXIgdGhhbiBkaXJlY3RseQ0KICBmcm9tIHRoZSBBREMuIFRoaXMgZW5zdXJlcyBtb3JlIGFjY3VyYXRlIHNhbXBsZSByZXN1bHRzIHRob3VnaHQgdGhlIGZhY3RvcnkNCiAgY2FsaWJyYXRpb24gYWRqdXN0bWVudCBwZXJmb3JtZWQgYnkgdGhlIFBQRS4NCiAgVGhlIFBQRSBjYW4gYmUgc2V0IHRvIGdlbmVyYXRlIGludGVycnVwdHMgd2hlbiBzcGVjaWZpYyB0aHJlc2hvbGQgdmFsdWVzIGFyZQ0KICByZWFjaGVkIG9uIGFuYWxvZyBpbnB1dHMgdGhyb3VnaCB0aGUgQUNFIENvbmZpZ3VyYXRvciBzb2Z0d2FyZSB0b29sLiBUaGVzZQ0KICB0aHJlc2hvbGRzIGNhbiBhbHNvIGJlIGR5bmFtaWNhbGx5IGFkanVzdGVkIHRocm91Z2ggdGhlIEFDRSBkcml2ZXIuDQoNCiAgVGhlIEFDRSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdGhlIFNpZ21hIERlbHRhIERBQ3MgaW5jbHVkZWQgd2l0aGluIHRoZQ0KICBBbmFsb2cgRnJvbnQgRW5kIChBRkUpLiBUaGlzIGludGVyZmFjZSBhbGxvd3MgY29udHJvbCBvZiB0aGUgREFDknMgb3V0cHV0DQogIHZhbHVlLiBEeW5hbWljIGNvbmZpZ3VyYXRpb24gb2YgdGhlIERBQyBpcyBhbHNvIHBvc3NpYmxlLg0KDQogIFRoZSBBQ0UgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHRoZSBoaWdoIHNwZWVkIGNvbXBhcmF0b3JzIGluY2x1ZGVkIHdpdGhpbg0KICB0aGUgQW5hbG9nIEZyb250IEVuZC4gVGhpcyBpbnRlcmZhY2UgYWxsb3dzIGR5bmFtaWMgY29uZmlndXJhdGlvbiBvZiB0aGUNCiAgY29tcGFyYXRvcnMgYW5kIGNvbnRyb2xsaW5nIGludGVycnVwdHMgYmFzZWQgb24gdGhlIGNvbXBhcmF0b3JzkiBzdGF0ZS4NCg0KICBAc2VjdGlvbiB0aGVvcnlfb3AgVGhlb3J5IG9mIE9wZXJhdGlvbg0KICBUaGUgY29uZmlndXJhdGlvbiBvZiB0aGUgQUNFIGlzIHNldCB0aG91Z2ggdGhlIHVzZSBvZiB0aGUgQUNFIENvbmZpZ3VyYXRvcg0KICBpbmNsdWRlZCBpbiB0aGUgU21hcnRGdXNpb24gTVNTIENvbmZpZ3VyYXRvciBzb2Z0d2FyZSB0b29sIHByb3ZpZGVkIGFzIHBhcnQgb2YNCiAgdGhlIExpYmVybyBJbnRlZ3JhdGVkIERlc2lnbiBFbnZpcm9ubWVudCB0b29sIHN1aXRlLiBUaGUgQUNFIENvbmZpZ3VyYXRvcg0KICBvZmZlcnMgYW4gZWFzeSB0byB1c2UgZ3JhcGhpY2FsIG1ldGhvZCBvZiBzZWxlY3RpbmcgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlDQogIGZvbGxvd2luZyBBQ0UgY2hhcmFjdGVyaXN0aWNzOg0KICAgIJUgQW5hbG9nIGlucHV0IGNoYW5uZWxzIGNvbmZpZ3VyYXRpb24NCiAgICCVIEFEQyBjb25maWd1cmF0aW9uDQogICAglSBBbmFsb2cgaW5wdXQgY2hhbm5lbHMgc2FtcGxpbmcgc2VxdWVuY2UNCiAgICCVIEZpbHRlcmluZyBhcHBsaWVkIHRvIGFuYWxvZyBpbnB1dCBzYW1wbGVzDQogICAglSBUaHJlc2hvbGQgZmxhZ3MgY29uZmlndXJhdGlvbiBpbmNsdWRpbmcgaHlzdGVyZXNpcyBvciBzdGF0ZSBmaWx0ZXJpbmcgcHJvcGVydGllcw0KICAgIJUgU2VsZWN0aW9uIG9mIHBvc3QgcHJvY2Vzc2luZyByZXN1bHRzIHRyYW5zZmVycmVkIHRob3VnaCBETUENCiAgICCVIFNpZ21hIERlbHRhIERBQ3MgY29uZmlndXJhdGlvbg0KICAgIJUgQW5hbG9nIGNvbXBhcmF0b3JzIGNvbmZpZ3VyYXRpb24NCiAgVGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gaGFyZHdhcmUgc2V0dGluZ3MsIFNTRSBtaWNyb2NvZGUgYW5kIFBQRSBtaWNyb2NvZGUNCiAgYXJlIHN0b3JlZCBpbiB0aGUgU21hcnRGdXNpb24gZU5WTS4gVGhpcyBjb25maWd1cmF0aW9uIGRhdGEgaXMgdXNlZCBieSB0aGUNCiAgc3lzdGVtIGJvb3QgdG8gY29uZmlndXJlIHRoZSBBQ0UgYWZ0ZXIgdGhlIHN5c3RlbSBjb21lIG91dCBvZiByZXNldCBhbmQgYmVmb3JlDQogIGNvbnRyb2wgaXMgcGFzc2VkIHRvIHRoZSBhcHBsaWNhdGlvbi4gVGhpcyByZXN1bHRzIGluIHRoZSBBQ0UgYmVpbmcgZnVsbHkNCiAgb3BlcmF0aW9uYWwgYnkgdGhlIHRpbWUgdGhlIGFwcGxpY2F0aW9uIHN0YXJ0cyBleGVjdXRpbmcuDQogIFRoZSBBQ0UgQ29uZmlndXJhdG9yIGFsc28gZ2VuZXJhdGVzIGEgc2V0IG9mIEMgZmlsZXMgY29udGFpbmluZyBpbmZvcm1hdGlvbg0KICBhYm91dCB0aGUgQUNFknMgY29uZmlndXJhdGlvbi4gVGhlc2UgQyBmaWxlcyBtdXN0IGJlIGNvcGllZCBpbnRvIHRoZQ0KICBkcml2ZXJzX2NvbmZpZy9tc3NfYWNlIGZvbGRlciBvZiB5b3UgciBzb2Z0d2FyZSBwcm9qZWN0IGZvciBjb25zdW1wdGlvbiBieSB0aGUNCiAgQUNFIGRyaXZlci4gVGhlIEFDRSBkcml2ZXIgdXNlcyB0aGUgY29udGVudCBvZiB0aGVzZSBjb25maWd1cmF0aW9uIGZpbGVzIHRvDQogIGludGVyYWN0IHdpdGggdGhlIGNvbmZpZ3VyZWQgQUNFIGhhcmR3YXJlLg0KDQogIFRoZSBBQ0UgZHJpdmVyIGZ1bmN0aW9ucyBhcmUgZ3JvdXBlZCBpbnRvIHRoZSBmb2xsb3dpbmcgY2F0ZWdvcmllczoNCiAgICCVIEluaXRpYWxpemF0aW9uDQogICAglSBSZWFkaW5nIGFuYWxvZyBpbnB1dCBjaGFubmVscyB2YWx1ZXMgYW5kIHByb3BlcnRpZXMNCiAgICCVIFBvc3QgUHJvY2Vzc2luZyBFbmdpbmUgZmxhZ3MNCiAgICCVIENvbnZlcnNpb24gZnVuY3Rpb25zIGJldHdlZW4gc2FtcGxlIHZhbHVlIGFuZCByZWFsIHdvcmxkIHVuaXRzDQogICAglSBTYW1wbGUgU2VxdWVuY2luZyBFbmdpbmUgY29udHJvbA0KICAgIJUgU2FtcGxlIFNlcXVlbmNpbmcgRW5naW5lIEludGVycnVwdHMgQ29udHJvbA0KICAgIJUgQ29tcGFyYXRvcnMgY29udHJvbA0KICAgIJUgU2lnbWEgRGVsdGEgRGlnaXRhbCB0byBBbmFsb2cgQ29udmVydGVycyAoU0REKSBjb250cm9sDQogICAglSBEaXJlY3QgYW5hbG9nIGJsb2NrIGNvbmZpZ3VyYXRpb24gYW5kIHVzYWdlDQoNCg0KICBJbml0aWFsaXphdGlvbg0KICAgIFRoZSBBQ0UgZHJpdmVyIGlzIGluaXRpYWxpemVkIHRocm91Z2ggYSBjYWxsIHRvIHRoZSBBQ0VfaW5pdCgpIGZ1bmN0aW9uLiBUaGUNCiAgICBBQ0VfaW5pdCgpIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgQUNFIGRyaXZlciBmdW5jdGlvbnMgY2FuDQogICAgYmUgY2FsbGVkLiBJdCBpbml0aWFsaXplcyB0aGUgQUNFknMgaW50ZXJuYWwgZGF0YS4NCg0KDQogIFJlYWRpbmcgYW5hbG9nIGlucHV0IGNoYW5uZWxzIHZhbHVlcyBhbmQgcHJvcGVydGllcw0KICAgIFRoZSBBQ0UgZHJpdmVyIGFsbG93cyByZXRyaWV2aW5nIHRoZSBtb3N0IHJlY2VudCBwb3N0IHByb2Nlc3NlZCBzYW1wbGUgdmFsdWUNCiAgICBmb3IgZWFjaCBhbmFsb2cgaW5wdXQuIEl0IGFsc28gYWxsb3dzIHJldHJpZXZpbmcgdGhlIG5hbWUgb2YgdGhlIGFuYWxvZyBpbnB1dA0KICAgIGNoYW5uZWwgYXNzaWduZWQgaW4gdGhlIEFDRSBDb25maWd1cmF0b3IgYW5kIHdoZXRoZXIgdGhlIGlucHV0IGNoYW5uZWwgc2FtcGxlcw0KICAgIGEgdm9sdGFnZSwgY3VycmVudCBvciB0ZW1wZXJhdHVyZS4NCiAgICBFYWNoIGluZGl2aWR1YWwgYW5hbG9nIGlucHV0IGNoYW5uZWwgaXMgaWRlbnRpZmllZCB1c2luZyBhIGNoYW5uZWwgaGFuZGxlIHdoaWNoDQogICAgaXMgcGFzc2VkIGFzIHBhcmFtZXRlciB0byB0aGUgQUNFIGlucHV0IGNoYW5uZWwgZHJpdmVyIGZ1bmN0aW9ucy4gVGhlIGNoYW5uZWwNCiAgICBoYW5kbGVzIGFyZSBkZXNpZ24gc3BlY2lmaWMuIFRoZSBsaXN0IG9mIGNoYW5uZWwgaGFuZGxlcyBpcyBnZW5lcmF0ZWQgYnkgdGhlDQogICAgQUNFIENvbmZpZ3VyYXRvciBiYXNlZCBvbiB0aGUgbmFtZXMgZ2l2ZW4gdG8gdGhlIGlucHV0IHNpZ25hbHMuIFRoZSBjaGFubmVsDQogICAgaGFuZGxlcyBjYW4gYmUgZm91bmQgaW4gdGhlIGRyaXZlcnNfY29uZmlnXG1zc19hY2VcYWNlX2hhbmRsZXMuaCBmaWxlLiAgVGhlDQogICAgY2hhbm5lbCBoYW5kbGUgY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIGNoYW5uZWwgbmFtZSB1c2luZyB0aGUgQUNFX2dldF9jaGFubmVsX2hhbmRsZSgpDQogICAgZnVuY3Rpb24uIEl0IGlzIGFsc28gcG9zc2libGUgdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUgY2hhbm5lbHMgdXNpbmcgdGhlDQogICAgQUNFX2dldF9maXJzdF9jaGFubmVsKCkgYW5kIEFDRV9nZXRfbmV4dF9jaGFubmVsKCkgZnVuY3Rpb25zLg0KDQogICAgUmVhZGluZyBhbmFsb2cgaW5wdXQgc2FtcGxlcyBmcm9tIHRoZSBwb3N0IHByb2Nlc3NpbmcgZW5naW5lIGlzIGRvbmUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoNCiAgICAgICAglSB1aW50MTZfdCBBQ0VfZ2V0X3BwZV9zYW1wbGUoIGFjZV9jaGFubmVsX2hhbmRsZV90IGNoYW5uZWxfaGFuZGxlICkNCg0KICAgIEluZm9ybWF0aW9uIGFib3V0IGFuIGlucHV0IGNoYW5uZWwgY2FuIGJlIHJldHJpZXZlZCB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoNCiAgICAgICAglSBjb25zdCB1aW50OF90ICogQUNFX2dldF9jaGFubmVsX25hbWUoIGFjZV9jaGFubmVsX2hhbmRsZV90IGNoYW5uZWxfaGFuZGxlICkNCiAgICAgICAglSBjaGFubmVsX3R5cGVfdCBBQ0VfZ2V0X2NoYW5uZWxfdHlwZSggYWNlX2NoYW5uZWxfaGFuZGxlX3QgY2hhbm5lbF9oYW5kbGUgKQ0KDQoNCiAgUG9zdCBQcm9jZXNzaW5nIEVuZ2luZSBmbGFncw0KICAgIFRoZSBTbWFydEZ1c2lvbiBBQ0UgUG9zdCBQcm9jZXNzaW5nIEVuZ2luZSAoUFBFKSBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBtb25pdG9yDQogICAgdGhlIHN0YXRlIG9mIGFuYWxvZyBpbnB1dCBjaGFubmVscyBhbmQgZGV0ZWN0IHdoZW4gY2VydGFpbiB0aHJlc2hvbGQgdmFsdWVzIGFyZQ0KICAgIGNyb3NzZWQuIEZsYWdzIGFyZSByYWlzZWQgYnkgdGhlIFBQRSB3aGVuIHRoZXNlIHRocmVzaG9sZHMgYXJlIGNyb3NzZWQuIEludGVycnVwdHMNCiAgICBjYW4gb3B0aW9uYWxseSBiZSBnZW5lcmF0ZWQgd2hlbiBmbGFncyBhcmUgcmFpc2VkLg0KICAgIFRoZSBmbGFncyBhcmUgZGVmaW5lZCB1c2luZyB0aGUgQUNFIENvbmZpZ3VyYXRvciBzb2Z0d2FyZSB0b29sLiBUaGUgZmxhZ5JzIG5hbWUsDQogICAgdGhyZXNob2xkIHZhbHVlIGFuZCBoeXN0ZXJlc2lzIHNldHRpbmdzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIEFDRSBDb25maWd1cmF0b3IuDQogICAgVGhlIEFDRSBDb25maWd1cmF0b3IgZ2VuZXJhdGVzIG1pY3JvY29kZSBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiB3aGljaA0KICAgIGlzIGV4ZWN1dGVkIGF0IHN5c3RlbSBydW4gdGltZSBieSB0aGUgUFBFLiBUaGUgUFBFIG1pY3JvY29kZSBpcyBsb2FkZWQgaW50byB0aGUNCiAgICBBQ0UgYXQgY2hpcCBib290IHRpbWUgYnkgdGhlIEFjdGVsIHByb3ZpZGVkIHN5c3RlbSBib290IGNvZGUuIE5vIEFDRSBkcml2ZXINCiAgICBpbnRlcnZlbnRpb24gaXMgcmVxdWlyZWQgdG8gbG9hZCB1cCB0aGUgUFBFIG1pY3JvY29kZS4NCiAgICBUaGUgQUNFIGRyaXZlciBhbGxvd3M6DQogICAgICAgIJUgUmV0cmlldmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcG9zdCBwcm9jZXNzaW5nIGVuZ2luZSBmbGFncw0KICAgICAgICCVIEFzc2lnbmluZyBhIGhhbmRsZXIgZnVuY3Rpb24gdG8gaW5kaXZpZHVhbCBmbGFnIGFzc2VydGlvbnMNCiAgICAgICAglSBBc3NpZ25pbmcgYSBoYW5kbGVyIGZ1bmN0aW9uIHRvIGZsYWdzIGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgYQ0KICAgICAgICAgIHNwZWNpZmljIGNoYW5uZWwNCiAgICAgICAglSBDb250cm9sbGluZyBmbGFnIGludGVycnVwdHMNCiAgICAgICAglSBEeW5hbWljYWxseSBtb2RpZnkgYSBmbGFnknMgdGhyZXNob2xkIHZhbHVlDQogICAgICAgIJUgRHluYW1pY2FsbHkgbW9kaWZ5IGEgZmxhZ5JzIGh5c3RlcmVzaXMNCg0KICAgIEVhY2ggaW5kaXZpZHVhbCBmbGFnIGlzIGlkZW50aWZpZWQgdXNpbmcgYSBmbGFnIGhhbmRsZSB3aGljaCBpcyBwYXNzZWQgYXMgcGFyYW1ldGVyDQogICAgdG8gdGhlIEFDRSBkcml2ZXIgZnVuY3Rpb25zIGNvbnRyb2xsaW5nIHRoZSBmbGFncy4gVGhlIGZsYWcgaGFuZGxlcyBhcmUgZGVzaWduDQogICAgc3BlY2lmaWMuIFRoZXkgYXJlIGRlZmluZWQgaW4gdGhlIGRyaXZlcnNfY29uZmlnXG1zc19hY2VcYWNlX2hhbmRsZXMuaCBmaWxlIHdoaWNoDQogICAgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBBQ0UgQ29uZmlndXJhdG9yIGJhc2VkIG9uIHRoZSBuYW1lcyBzZWxlY3RlZCBmb3IgdGhlIHNpZ25hbA0KICAgIGFuZCBmbGFnIG5hbWVzLiBBIGZsYWcgaGFuZGxlIGNhbiBiZSBvYnRhaW5lZCBmcm9tIHRoZSBkcml2ZXIgdXNpbmcgdGhlIG5hbWUgb2YNCiAgICB0aGUgZmxhZyBlbnRlcmVkIGluIHRoZSBBQ0UgQ29uZmlndXJhdG9yIHNvZnR3YXJlIHdoZW4gdGhlIGZsYWcgd2FzIGNyZWF0ZWQuIEENCiAgICBmbGFnIGhhbmRsZSBjYW4gYWxzbyBiZSBvYnRhaW5lZCB1c2luZyB0aGUgZnVuY3Rpb25zIEFDRV9nZXRfY2hhbm5lbF9maXJzdF9mbGFnKCkNCiAgICBhbmQgQUNFX2dldF9jaGFubmVsX25leHRfZmxhZygpIHdoZW4gaXRlcmF0aW5nIHRocm91Z2ggdGhlIGZsYWdzIGFzc29jaWF0ZWQgd2l0aA0KICAgIGFuIGFuYWxvZyBpbnB1dCBjaGFubmVsLiAgVGhlIGZ1bmN0aW9ucyBhdmFpbGFibGUgZm9yIHJldHJpZXZpbmcgZmxhZyBoYW5kbGVzIGFyZToNCiAgICAgICAglSBhY2VfZmxhZ19oYW5kbGVfdCBBQ0VfZ2V0X2ZsYWdfaGFuZGxlIChjb25zdCB1aW50OF90ICpwX3N6X2Z1bGxfZmxhZ19uYW1lKQ0KICAgICAgICCVIGFjZV9mbGFnX2hhbmRsZV90IEFDRV9nZXRfY2hhbm5lbF9maXJzdF9mbGFnIChhY2VfY2hhbm5lbF9oYW5kbGVfdCBjaGFubmVsX2hhbmRsZSwgdWludDE2X3QgKml0ZXJhdG9yKQ0KICAgICAgICCVIGFjZV9mbGFnX2hhbmRsZV90IEFDRV9nZXRfY2hhbm5lbF9uZXh0X2ZsYWcgKGFjZV9jaGFubmVsX2hhbmRsZV90IGNoYW5uZWxfaGFuZGxlLCB1aW50MTZfdCAqaXRlcmF0b3IpDQoNCiAgICBUaGUgY3VycmVudCBzdGF0dXMgb2YgYSBmbGFnIGNhbiBiZSBwb2xsZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoNCiAgICAgICAglSBpbnQzMl90IEFDRV9nZXRfZmxhZ19zdGF0dXMgKGFjZV9mbGFnX2hhbmRsZV90IGZsYWdfaGFuZGxlKQ0KDQogICAgSW50ZXJydXB0IGhhbmRsZXJzIGNhbiBiZSByZWdpc3RlcmVkIHdpdGggdGhlIEFDRSBkcml2ZXIgdG8gaGFuZGxlIGluZGl2aWR1YWwNCiAgICBmbGFncy4gVGhlc2UgaW50ZXJydXB0IGhhbmRsZXJzIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBBQ0UgZHJpdmVyIHdoZW4gYSBzcGVjaWZpYw0KICAgIGZsYWcgaXMgcmFpc2VkLiBUaGUgZmxhZyBpbnRlcnJ1cHQgY29udHJvbCBmdW5jdGlvbnMgYXJlOg0KICAgICAgICCVIHZvaWQgQUNFX3JlZ2lzdGVyX2ZsYWdfaXNyIChhY2VfZmxhZ19oYW5kbGVfdCBmbGFnX2hhbmRsZSwgZmxhZ19pc3JfdCBmbGFnX2lzcikNCiAgICAgICAglSB2b2lkIEFDRV9lbmFibGVfZmxhZ19pcnEgKGFjZV9mbGFnX2hhbmRsZV90IGZsYWdfaGFuZGxlKQ0KICAgICAgICCVIHZvaWQgQUNFX2Rpc2FibGVfZmxhZ19pcnEgKGFjZV9mbGFnX2hhbmRsZV90IGZsYWdfaGFuZGxlKQ0KICAgICAgICCVIHZvaWQgQUNFX2NsZWFyX2ZsYWdfaXJxIChhY2VfZmxhZ19oYW5kbGVfdCBmbGFnX2hhbmRsZSkNCg0KICAgIEludGVycnVwdCBoYW5kbGVycyBjYW4gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBBQ0UgZHJpdmVyIHRvIGhhbmRsZSBhbGwgZmxhZ3MNCiAgICBhc3NvY2lhdGVkIHdpdGggb25lIHNwZWNpZmljIGFuYWxvZyBpbnB1dCBjaGFubmVsLiBUaGVzZSBpbnRlcnJ1cHQgaGFuZGxlcnMgd2lsbA0KICAgIGJlIGNhbGxlZCBieSB0aGUgQUNFIGRyaXZlciB3aGVuIG9uZSBvZiB0aGUgZmxhZ3MsIGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgc3RhdGUgb2YNCiAgICB0aGUgc3BlY2lmaWVkIGFuYWxvZyBpbnB1dCBjaGFubmVsLCBpcyByYWlzZWQuIFRoZSBjaGFubmVsIGZsYWcgaW50ZXJydXB0IGNvbnRyb2wNCiAgICBmdW5jdGlvbnMgYXJlOg0KICAgICAgICCVIHZvaWQgQUNFX3JlZ2lzdGVyX2NoYW5uZWxfZmxhZ3NfaXNyIChhY2VfY2hhbm5lbF9oYW5kbGVfdCBjaGFubmVsX2hhbmRsZSwgY2hhbm5lbF9mbGFnX2lzcl90IGNoYW5uZWxfZmxhZ19pc3IpDQogICAgICAgIJUgdm9pZCBBQ0VfZW5hYmxlX2NoYW5uZWxfZmxhZ3NfaXJxIChhY2VfY2hhbm5lbF9oYW5kbGVfdCBjaGFubmVsX2hhbmRsZSkNCiAgICAgICAglSB2b2lkIEFDRV9kaXNhYmxlX2NoYW5uZWxfZmxhZ3NfaXJxIChhY2VfY2hhbm5lbF9oYW5kbGVfdCBjaGFubmVsX2hhbmRsZSkNCiAgICAgICAglSB2b2lkIEFDRV9jbGVhcl9jaGFubmVsX2ZsYWdzX2lycSAoYWNlX2NoYW5uZWxfaGFuZGxlX3QgY2hhbm5lbF9oYW5kbGUpDQoNCiAgICBBIHNpbmdsZSBnbG9iYWwgaW50ZXJydXB0IGhhbmRsZXIgY2FuIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgQUNFIGRyaXZlci4gVGhlIGdsb2JhbA0KICAgIGZsYWcgaW50ZXJydXB0IGhhbmRsZXIgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYnkgdGhlIEFDRSBkcml2ZXIgd2hlbiBhbnkgb2YgdGhlDQogICAgaW50ZXJydXB0IGVuYWJsZWQgZmxhZyBpcyByYWlzZWQuIFRoZSBoYW5kbGUgb2YgdGhlIGZsYWcgY2F1c2luZyB0aGUgaW50ZXJydXB0IGFuZA0KICAgIHRoZSBoYW5kbGUgb2YgdGhlIGFzc29jaWF0ZWQgYW5hbG9nIGlucHV0IGNoYW5uZWwgaXMgcGFzc2VkIGFzIHBhcmFtZXRlciB0byB0aGUNCiAgICByZWdpc3RlcmVkIGdsb2JhbCBmbGFnIGhhbmRsZXIuDQogICAgICAgIJUgdm9pZCBBQ0VfcmVnaXN0ZXJfZ2xvYmFsX2ZsYWdzX2lzciAoZ2xvYmFsX2ZsYWdfaXNyX3QgZ2xvYmFsX2ZsYWdfaXNyKQ0KDQogICAgVGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBmbGFnIGNhbiBiZSBkeW5hbWljYWxseSBtb2RpZmllZCB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoNCiAgICAgICAglSB2b2lkIEFDRV9zZXRfZmxhZ190aHJlc2hvbGQgKGFjZV9mbGFnX2hhbmRsZV90IGZsYWdfaGFuZGxlLCB1aW50MTZfdCBuZXdfdGhyZXNob2xkKQ0KICAgICAgICCVIHZvaWQgQUNFX3NldF9mbGFnX2h5c3RlcmVzaXMgKGFjZV9mbGFnX2hhbmRsZV90IGZsYWdfaGFuZGxlLCB1aW50MTZfdCBhZGNfaHlzdGVyZXNpcykNCiAgICAgICAglSB2b2lkIEFDRV9zZXRfY2hhbm5lbF9oeXN0ZXJlc2lzIChhY2VfY2hhbm5lbF9oYW5kbGVfdCBjaGFubmVsX2hhbmRsZSwgdWludDE2X3QgYWRjX2h5c3RlcmVzaXMpDQogICAgICAgIJUgdm9pZCBBQ0Vfc2V0X2ZsYWdfYXNzZXJ0aW9uKCBhY2VfZmxhZ19oYW5kbGVfdCAgIGZsYWdfaGFuZGxlLCB1aW50MTZfdCBhc3NlcnRpb25fdmFsdWUgKQ0KICAgICAgICCVIHZvaWQgQUNFX3NldF9mbGFnX2RlYXNzZXJ0aW9uKCBhY2VfZmxhZ19oYW5kbGVfdCAgIGZsYWdfaGFuZGxlLCB1aW50MTZfdCBhc3NlcnRpb25fdmFsdWUgKQ0KDQogICAgSW5mb3JtYXRpb24gYWJvdXQgYSBmbGFnIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgb25jZQ0KICAgIHRoZSBmbGFnIGhhbmRsZSBpcyBrbm93bjoNCiAgICAgICAglSBjb25zdCB1aW50OF90ICogQUNFX2dldF9mbGFnX25hbWUgKGFjZV9mbGFnX2hhbmRsZV90IGZsYWdfaGFuZGxlKQ0KICAgICAgICCVIGFjZV9jaGFubmVsX2hhbmRsZV90IEFDRV9nZXRfZmxhZ19jaGFubmVsIChhY2VfZmxhZ19oYW5kbGVfdCBmbGFnX2hhbmRsZSkNCg0KDQogIENvbnZlcnNpb24gdG8gYW5kIGZyb20gcmVhbCB3b3JsZCB1bml0cw0KICAgIFRoZSBBQ0UgZHJpdmVyIHByb3ZpZGVzIGEgc2V0IG9mIGNvbnZlcnNpb24gZnVuY3Rpb25zIHRvIGNvbnZlcnQgc2FtcGxlIHZhbHVlcw0KICAgIHJlYWQgZnJvbSB0aGUgcG9zdCBwcm9jZXNzaW5nIGVuZ2luZSBpbnRvIHJlYWwgd29ybGQgdW5pdHM6DQogICAgICAgIJUgbWlsbGl2b2x0cw0KICAgICAgICCVIG1pbGxpYW1wcw0KICAgICAgICCVIERlZ3JlZXMgS2VsdmluDQogICAgICAgIJUgRGVncmVlcyBDZWxzaXVzDQogICAgICAgIJUgRGVncmVlcyBGYWhyZW5oZWl0DQogICAgQ29udmVyc2lvbiBmdW5jdGlvbnMgYXJlIGFsc28gYXZhaWxhYmxlIHRvIGNvbnZlcnQgZnJvbSByZWFsIHdvcmxkIHVuaXRzIGludG8NCiAgICBQUEUgc2FtcGxlIHZhbHVlcy4gVGhlc2UgZnVuY3Rpb25zIGFyZSB0eXBpY2FsbHkgdXNlZCBmb3IgZHluYW1pY2FsbHkgYWRqdXN0aW5nDQogICAgZmxhZ3MgdGhyZXNob2xkIHZhbHVlcy4NCg0KDQogIFNhbXBsZSBTZXF1ZW5jaW5nIEVuZ2luZSBjb250cm9sDQogICAgVGhlIEFDRSBkcml2ZXIgcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGZvciBkeW5hbWljYWxseSBjb250cm9sbGluZyB0aGUNCiAgICBTYW1wbGUgU2VxdWVuY2luZyBFbmdpbmUuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgb25seSByZXF1aXJlZCBmb3IgbWFuYWdpbmcgbXVsdGlwbGUNCiAgICBzYW1wbGluZyBzZXF1ZW5jZXMuIFRoZSB1c2Ugb2YgdGhlc2UgZnVuY3Rpb25zIGlzIG5vdCByZXF1aXJlZCBmb3IgbW9zdCBhcHBsaWNhdGlvbnMNCiAgICBzaW5jZSB0aGUgU1NFIGlzIGFscmVhZHkgY29uZmlndXJlZCBhbmQgcnVubmluZyBieSB0aGUgdGltZSB0aGUgYXBwbGljYXRpb24gc3RhcnRzLg0KDQoNCiAgU2FtcGxlIFNlcXVlbmNpbmcgRW5naW5lIEludGVycnVwdHMgQ29udHJvbA0KICAgIFRoZSBBQ0UgZHJpdmVyIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgaW50ZXJydXB0cyBnZW5lcmF0ZWQgYnkNCiAgICB0aGUgU2FtcGxlIFNlcXVlbmNpbmcgRW5naW5lLiBUaGVzZSBmdW5jdGlvbnMgYWxsb3cgZW5hYmxpbmcsIGRpc2FibGluZyBhbmQgY2xlYXJpbmcNCiAgICBpbnRlcnJ1cHQgZGVmaW5lZCBhcyBwYXJ0IG9mIHRoZSBzYW1wbGluZyBzZXF1ZW5jZS4gVGhlc2UgZnVuY3Rpb25zIGFsc28gYWxsb3cNCiAgICBjb250cm9sbGluZyBpbnRlcnJ1cHRzIGdlbmVyYXRlZCBieSB0aGUgQURDcy4NCg0KDQogIENvbXBhcmF0b3JzIGNvbnRyb2wNCiAgICBUaGUgQUNFIGRyaXZlciBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIGludGVycnVwdHMgZ2VuZXJhdGVkIGJhc2VkDQogICAgb24gdGhlIGNoYW5nZSBvZiBzdGF0ZSBvZiB0aGUgaGlnaCBzcGVlZCBjb21wYXJhdG9ycy4gRnVuY3Rpb25zIGFyZSBhbHNvIHByb3ZpZGVkDQogICAgdG8gZHluYW1pY2FsbHkgbW9kaWZ5IHRoZSBjb21wYXJhdG9ycyBjb25maWd1cmF0aW9uLg0KDQoNCiAgU2lnbWEgRGVsdGEgRGlnaXRhbCB0byBBbmFsb2cgQ29udmVydGVycyAoU0REKSBjb250cm9sDQogICAgVGhlIEFDRSBkcml2ZXIgcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBjb250cm9sbGluZyB0aGUgb3V0cHV0IHZhbHVlIG9mIHRoZSBTaWdtYQ0KICAgIERlbHRhIERBQ3MgKFNERCkuIEZ1bmN0aW9ucyBhcmUgYWxzbyBwcm92aWRlZCBmb3IgZHluYW1pY2FsbHkgYWRqdXN0aW5nIHRoZQ0KICAgIGNvbmZpZ3VyYXRpb24gb2YgdGhlIFNERHMuDQoNCiAqLy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQojaWZuZGVmIF9fTVNTX0FDRV9IXw0KI2RlZmluZSBfX01TU19BQ0VfSF8NCg0KI2luY2x1ZGUgPHN0ZGludC5oPg0KDQojaWZkZWYgX19jcGx1c3BsdXMNCmV4dGVybiAiQyIgew0KI2VuZGlmDQoNCiNpbmNsdWRlICJhY2VfaGFuZGxlcy5oIg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBBbmFsb2cgdG8gRGlnaXRhbCBDb252ZXJ0ZXIgY2hhbm5lbCBJRHMuDQogIFRoaXMgZW51bWVyYXRpb24gaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgQURDJ3MgYW5hbG9nIGlucHV0cy4gSXQgY2F0ZXJzIGZvciB1cA0KICB0byB0aHJlZSBBRENzL0FuYWxvZyBNb2R1bGVzIGFzIGNhbiBiZSBmb3VuZCBvbiB0aGUgbGFyZ2VyIHBhcnRzIG9mIHRoZQ0KICBTbWFydEZ1c2lvbiBmYW1pbHkuIFRoZSBjaGFubmVsIElEIG51bWJlcmluZyBpcyBkZXNpZ25lZCB0byBhbGxvdyBlYXN5DQogIGV4dHJhY3Rpb24gb2YgdGhlIEFEQyBudW1iZXIgYW5kIGFsc28gdGhlIGluZGl2aWR1YWwgQURDIGlucHV0IG51bWJlciBieSBzaW1wbGUNCiAgc2hpZnRpbmcgYW5kIG1hc2tpbmcuIFRoaXMgZW51bWVyYXRpb24gaXMgdXNlZCBhcyBwYXJhbWV0ZXIgdG8gdGhlDQogIEFDRV9nZXRfaW5wdXRfY2hhbm5lbF9oYW5kbGUoKSBmdW5jdGlvbiByZXRyaWV2aW5nIHRoZSBjaGFubmVsIGhhbmRsZSBhc3NvY2lhdGVkDQogIHdpdGggYSBzcGVjaWZpYyBhbmFsb2cgaW5wdXQgc2lnbmFsLg0KICovDQp0eXBlZGVmIGVudW0NCnsNCiAgICBBREMwXzFQNVYgPSAwLCAgICAgICAgLyohPCBBbmFsb2cgTW9kdWxlIDAsIDEuNVYvR05EICovDQogICAgQUJQUzAgPSAxLCAgICAgICAgICAgIC8qITwgQW5hbG9nIE1vZHVsZSAwLCBRdWFkMCBBY3RpdmUgQmlwb2xhciBQcmUtU2NhbGVyIGlucHV0IDEgKi8NCiAgICBBQlBTMSA9IDIsICAgICAgICAgICAgLyohPCBBbmFsb2cgTW9kdWxlIDAsIFF1YWQwIEFjdGl2ZSBCaXBvbGFyIFByZS1TY2FsZXIgaW5wdXQgMiAqLw0KICAgIENNMCA9IDMsICAgICAgICAgICAgICAvKiE8IEFuYWxvZyBNb2R1bGUgMCwgUXVhZDAgQ3VycmVudCBNb25pdG9yIEJsb2NrICovDQogICAgVE0wID0gNCwgICAgICAgICAgICAgIC8qITwgQW5hbG9nIE1vZHVsZSAwLCBRdWFkMCBUZW1wZXJhdHVyZSBNb25pdG9yIEJsb2NrICovDQogICAgQUJQUzIgPSA1LCAgICAgICAgICAgIC8qITwgQW5hbG9nIE1vZHVsZSAwLCBRdWFkMSBBY3RpdmUgQmlwb2xhciBQcmUtU2NhbGVyIGlucHV0IDEgKi8NCiAgICBBQlBTMyA9IDYsICAgICAgICAgICAgLyohPCBBbmFsb2cgTW9kdWxlIDAsIFF1YWQxIEFjdGl2ZSBCaXBvbGFyIFByZS1TY2FsZXIgaW5wdXQgMiAqLw0KICAgIENNMSA9IDcsICAgICAgICAgICAgICAvKiE8IEFuYWxvZyBNb2R1bGUgMCwgUXVhZDEgQ3VycmVudCBNb25pdG9yIEJsb2NrICovDQogICAgVE0xID0gOCwgICAgICAgICAgICAgIC8qITwgQW5hbG9nIE1vZHVsZSAwLCBRdWFkMSBUZW1wZXJhdHVyZSBNb25pdG9yIEJsb2NrICovDQogICAgQURDMCA9IDksICAgICAgICAgICAgIC8qITwgQW5hbG9nIE1vZHVsZSAwIERpcmVjdCBJbnB1dCAwICovDQogICAgQURDMSA9IDEwLCAgICAgICAgICAgIC8qITwgQW5hbG9nIE1vZHVsZSAwIERpcmVjdCBJbnB1dCAxICovDQogICAgQURDMiA9IDExLCAgICAgICAgICAgIC8qITwgQW5hbG9nIE1vZHVsZSAwIERpcmVjdCBJbnB1dCAyICovDQogICAgQURDMyA9IDEyLCAgICAgICAgICAgIC8qITwgQW5hbG9nIE1vZHVsZSAwIERpcmVjdCBJbnB1dCAzICovDQogICAgU0REMF9JTiA9IDE1LCAgICAgICAgIC8qITwgQW5hbG9nIE1vZHVsZSAwIFNpZ21hLURlbHRhIERBQyBvdXRwdXQgKi8NCg0KICAgIEFEQzFfMVA1ViA9IDE2LCAgICAgICAvKiE8IEFuYWxvZyBNb2R1bGUgMSwgMS41Vi9HTkQgKi8NCiAgICBBQlBTNCA9IDE3LCAgICAgICAgICAgLyohPCBBbmFsb2cgTW9kdWxlIDEsIFF1YWQwIEFjdGl2ZSBCaXBvbGFyIFByZS1TY2FsZXIgaW5wdXQgMSAqLw0KICAgIEFCUFM1ID0gMTgsICAgICAgICAgICAvKiE8IEFuYWxvZyBNb2R1bGUgMSwgUXVhZDAgQWN0aXZlIEJpcG9sYXIgUHJlLVNjYWxlciBpbnB1dCAyICovDQogICAgQ00yID0gMTksICAgICAgICAgICAgIC8qITwgQW5hbG9nIE1vZHVsZSAxLCBRdWFkMCBDdXJyZW50IE1vbml0b3IgQmxvY2sgKi8NCiAgICBUTTIgPSAyMCwgICAgICAgICAgICAgLyohPCBBbmFsb2cgTW9kdWxlIDEsIFF1YWQwIFRlbXBlcmF0dXJlIE1vbml0b3IgQmxvY2sgKi8NCiAgICBBQlBTNiA9IDIxLCAgICAgICAgICAgLyohPCBBbmFsb2cgTW9kdWxlIDEsIFF1YWQxIEFjdGl2ZSBCaXBvbGFyIFByZS1TY2FsZXIgaW5wdXQgMSAqLw0KICAgIEFCUFM3ID0gMjIsICAgICAgICAgICAvKiE8IEFuYWxvZyBNb2R1bGUgMSwgUXVhZDEgQWN0aXZlIEJpcG9sYXIgUHJlLVNjYWxlciBpbnB1dCAyICovDQogICAgQ00zID0gMjMsICAgICAgICAgICAgIC8qITwgQW5hbG9nIE1vZHVsZSAxLCBRdWFkMSBDdXJyZW50IE1vbml0b3IgQmxvY2sgKi8NCiAgICBUTTMgPSAyNCwgICAgICAgICAgICAgLyohPCBBbmFsb2cgTW9kdWxlIDEsIFF1YWQxIFRlbXBlcmF0dXJlIE1vbml0b3IgQmxvY2sgKi8NCiAgICBBREM0ID0gMjUsICAgICAgICAgICAgLyohPCBBbmFsb2cgTW9kdWxlIDEgRGlyZWN0IElucHV0IDAgKi8NCiAgICBBREM1ID0gMjYsICAgICAgICAgICAgLyohPCBBbmFsb2cgTW9kdWxlIDEgRGlyZWN0IElucHV0IDEgKi8NCiAgICBBREM2ID0gMjcsICAgICAgICAgICAgLyohPCBBbmFsb2cgTW9kdWxlIDEgRGlyZWN0IElucHV0IDIgKi8NCiAgICBBREM3ID0gMjgsICAgICAgICAgICAgLyohPCBBbmFsb2cgTW9kdWxlIDEgRGlyZWN0IElucHV0IDMgKi8NCiAgICBTREQxX0lOID0gMzEsICAgICAgICAgLyohPCBBbmFsb2cgTW9kdWxlIDEgU2lnbWEtRGVsdGEgREFDIG91dHB1dCAqLw0KDQogICAgQURDMl8xUDVWID0gMzIsICAgICAgIC8qITwgQW5hbG9nIE1vZHVsZSAyLCAxLjVWL0dORCAqLw0KICAgIEFCUFM4ID0gMzMsICAgICAgICAgICAvKiE8IEFuYWxvZyBNb2R1bGUgMiwgUXVhZDAgQWN0aXZlIEJpcG9sYXIgUHJlLVNjYWxlciBpbnB1dCAxICovDQogICAgQUJQUzkgPSAzNCwgICAgICAgICAgIC8qITwgQW5hbG9nIE1vZHVsZSAyLCBRdWFkMCBBY3RpdmUgQmlwb2xhciBQcmUtU2NhbGVyIGlucHV0IDIgKi8NCiAgICBDTTQgPSAzNSwgICAgICAgICAgICAgLyohPCBBbmFsb2cgTW9kdWxlIDIsIFF1YWQwIEN1cnJlbnQgTW9uaXRvciBCbG9jayAqLw0KICAgIFRNNCA9IDM2LCAgICAgICAgICAgICAvKiE8IEFuYWxvZyBNb2R1bGUgMiwgUXVhZDAgVGVtcGVyYXR1cmUgTW9uaXRvciBCbG9jayAqLw0KICAgIEFCUFMxMCA9IDM3LCAgICAgICAgICAvKiE8IEFuYWxvZyBNb2R1bGUgMiwgUXVhZDEgQWN0aXZlIEJpcG9sYXIgUHJlLVNjYWxlciBpbnB1dCAxICovDQogICAgQUJQUzExID0gMzgsICAgICAgICAgIC8qITwgQW5hbG9nIE1vZHVsZSAyLCBRdWFkMSBBY3RpdmUgQmlwb2xhciBQcmUtU2NhbGVyIGlucHV0IDIgKi8NCiAgICBDTTUgPSAzOSwgICAgICAgICAgICAgLyohPCBBbmFsb2cgTW9kdWxlIDIsIFF1YWQxIEN1cnJlbnQgTW9uaXRvciBCbG9jayAqLw0KICAgIFRNNSA9IDQwLCAgICAgICAgICAgICAvKiE8IEFuYWxvZyBNb2R1bGUgMiwgUXVhZDEgVGVtcGVyYXR1cmUgTW9uaXRvciBCbG9jayAqLw0KICAgIEFEQzggPSA0MSwgICAgICAgICAgICAvKiE8IEFuYWxvZyBNb2R1bGUgMiBEaXJlY3QgSW5wdXQgMCAqLw0KICAgIEFEQzkgPSA0MiwgICAgICAgICAgICAvKiE8IEFuYWxvZyBNb2R1bGUgMiBEaXJlY3QgSW5wdXQgMSAqLw0KICAgIEFEQzEwID0gNDMsICAgICAgICAgICAvKiE8IEFuYWxvZyBNb2R1bGUgMiBEaXJlY3QgSW5wdXQgMiAqLw0KICAgIEFEQzExID0gNDQsICAgICAgICAgICAvKiE8IEFuYWxvZyBNb2R1bGUgMiBEaXJlY3QgSW5wdXQgMyAqLw0KICAgIFNERDJfSU4gPSA0NywgICAgICAgICAvKiE8IEFuYWxvZyBNb2R1bGUgMiBTaWdtYS1EZWx0YSBEQUMgb3V0cHV0ICovDQogICAgSU5WQUxJRF9DSEFOTkVMID0gMjU1IC8qITwgVXNlZCB0byBpbmRpY2F0ZSBlcnJvcnMgKi8NCn0gYWRjX2NoYW5uZWxfaWRfdDsNCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgQUNFX2luaXQoKSBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgU21hcnRGdXNpb24gTVNTIEFDRSBkcml2ZXIuIEl0DQogIGluaXRpYWxpemVzIHRoZSBBQ0UgZHJpdmVyknMgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLiBUaGUgQUNFX2luaXQoKSBmdW5jdGlvbg0KICBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIE1TUyBBQ0UgZHJpdmVyIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkLg0KICovDQp2b2lkIEFDRV9pbml0KCB2b2lkICk7DQoNCg0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiA9PT09PT09PT09PT09PSBEaXJlY3QgQW5hbG9nIEJsb2NrIENvbmZpZ3VyYXRpb24gYW5kIFVzYWdlID09PT09PT09PT09PT09PT09PT09DQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KDQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLy8qKg0KICBAZGVmZ3JvdXAgZ3JvdXAxIERpcmVjdCBBbmFsb2cgQmxvY2sgQ29uZmlndXJhdGlvbiBhbmQgVXNhZ2UNCiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBpbnRlbmRlZCBmb3IgdXNpbmcgdGhlIFNtYXJ0RnVzaW9uIGFuYWxvZyBibG9jayBoYXJkd2FyZQ0KICB3aXRob3V0IHJlbHlpbmcgb24gdGhlIFNhbXBsaW5nIFNlcXVlbmNlIEVuZ2luZSBvciBQb3N0IFByb2Nlc3NpbmcgZW5naW5lLg0KICBAew0KICovLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV9zdGFydF9hZGMoKSBmdW5jdGlvbiBpbml0aWF0ZXMgdGhlIHNhbXBsaW5nIG9mIHRoZSBhbmFsb2cgaW5wdXQNCiAgY2hhbm5lbCBpZGVudGlmaWVkIGJ5IHRoZSBjaGFubmVsX2lkIHBhcmFtZXRlci4gVGhpcyBmdW5jdGlvbiBpcyBwcm92aWRlZCBmb3INCiAgdGVzdCBwdXJwb3Nlcy4gSXQgbXVzdCBub3QgYmUgdXNlZCB3aGlsZSB0aGUgU2FtcGxlIFNlcXVlbmNpbmcgRW5naW5lIGlzDQogIHJ1bm5pbmcuDQoNCiAgQHBhcmFtIGNoYW5uZWxfaWQNCiAgICBUaGUgY2hhbm5lbF9pZCBwYXJhbWV0ZXIgaWRlbnRpZmllcyB0aGUgYW5hbG9nIGlucHV0IGNoYW5uZWwgdG8gc2FtcGxlLg0KDQogIEByZXR1cm4NCiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLg0KICovDQp2b2lkIEFDRV9zdGFydF9hZGMNCigNCglhZGNfY2hhbm5lbF9pZF90IGNoYW5uZWxfaWQNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfZ2V0X2FkY19yZXN1bHQgKCkgZnVuY3Rpb24gcmVhZHMgdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBpbnB1dCBjaGFubmVsDQogIHNhbXBsaW5nIHBlcmZvcm1lZCBieSB0aGUgQURDIGlkZW50aWZpZWQgYXMgcGFyYW1ldGVyLg0KDQogIEBwYXJhbSBhZGNfaWQNCiAgICBUaGUgYWRjX2lkIHBhcmFtZXRlciBpZGVudGlmaWVzIHdoaWNoIG9mIHRoZSBwb3NzaWJsZSB0aHJlZSBBREMgdG8gcmVhZCB0aGUNCiAgICBzYW1wbGUgcmVzdWx0IGZyb20uDQoNCiAgQHJldHVybg0KICAgIFRoZSBBQ0Vfc3RhcnRfYWRjX3N5bmMoKSBmdW5jdGlvbiByZXR1cm5zIHRoZSBBREMgcmVzdWx0IGZyb20gdGhlIEFEQw0KICAgIHNwZWNpZmllZCBhcyBwYXJhbWV0ZXIuDQogKi8NCnVpbnQxNl90IEFDRV9nZXRfYWRjX3Jlc3VsdA0KKA0KICAgIHVpbnQ4X3QgYWRjX2lkDQopOw0KDQovKiogQH0gKi8NCg0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiA9PT09PT09PT09PSBTaWdtYSBEZWx0YSBEaWdpdGFsIHRvIEFuYWxvZyBDb252ZXJ0ZXJzIChTREQpIENvbnRyb2wgPT09PT09PT09PT09DQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8vKioNCiAgQGRlZmdyb3VwIGdyb3VwMiBTaWdtYSBEZWx0YSBEaWdpdGFsIHRvIEFuYWxvZyBDb252ZXJ0ZXJzIChTREQpIENvbnRyb2wNCiAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gY29udHJvbCB0aGUgU2lnbWEgRGVsdGEgREFDcyBpbmNsdWRlZA0KICB3aXRoaW4gdGhlIFNtYXJ0RnVzaW9uIGFuYWxvZyBibG9jay4NCiAgQHsNCiAqLy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBzZGRfaWRfdCBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBTaWdtYSBEZWx0YSBEQUNzIHRvIHRoZSBTREQNCiAgY29udHJvbCBmdW5jdGlvbnMsIEFDRV9jb25maWd1cmVfc2RkKCksIEFDRV9lbmFibGVfc2RkKCksIEFDRV9kaXNhYmxlX3NkZCgpDQogIGFuZCBBQ0Vfc2V0X3NkZF92YWx1ZSgpLiBUaGVyZSBpcyBvbmUgU0REIHBlciBhbmFsb2cgbW9kdWxlLg0KICovDQp0eXBlZGVmIGVudW0NCnsNCiAgICBTREQwX09VVCA9IDAsICAgIC8qITwgQW5hbG9nIE1vZHVsZSAwIFNpZ21hIERlbHRhIERBQyAqLw0KICAgIFNERDFfT1VUID0gMSwgICAgLyohPCBBbmFsb2cgTW9kdWxlIDEgU2lnbWEgRGVsdGEgREFDICovDQogICAgU0REMl9PVVQgPSAyLCAgICAvKiE8IEFuYWxvZyBNb2R1bGUgMiBTaWdtYSBEZWx0YSBEQUMgKi8NCiAgICBOQl9PRl9TREQgPSAzDQp9IHNkZF9pZF90Ow0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgc2RkX3Jlc29sdXRpb25fdCBlbnVtZXJhdGlvbiBpcyB1c2VkIGFzIGEgcGFyYW1ldGVyIHRvIHRoZQ0KICBBQ0VfY29uZmlndXJlX3NkZCgpIGZ1bmN0aW9uIHRvIHNwZWNpZnkgREFDIHJlc29sdXRpb24gb2YgdGhlIFNpZ21hIERlbHRhIERBQy4NCiAqLw0KdHlwZWRlZiBlbnVtDQp7DQogICAgU0REXzhfQklUUyA9IDAsDQogICAgU0REXzE2X0JJVFMgPSA0LA0KICAgIFNERF8yNF9CSVRTID0gOA0KfSBzZGRfcmVzb2x1dGlvbl90Ow0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGVzZSBjb25zdGFudCBkZWZpbml0aW9ucyBhcmUgdXNlZCBhcyBhbiBhcmd1bWVudCB0byB0aGUgQUNFX2NvbmZpZ3VyZV9zZGQoKQ0KICBmdW5jdGlvbiB0byBzcGVjaWZ5IG9wZXJhdGluZyBtb2RlIG9mIHRoZSBTaWdtYSBEZWx0YSBEQUMuDQogKi8NCiNkZWZpbmUgU0REX0NVUlJFTlRfTU9ERSAgICAxDQojZGVmaW5lIFNERF9WT0xUQUdFX01PREUgICAgMA0KI2RlZmluZSBTRERfUkVUVVJOX1RPX1pFUk8gIDANCiNkZWZpbmUgU0REX05PTl9SVFogICAgICAgICAyDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBzZGRfdXBkYXRlX21ldGhvZF90IGVudW1lcmF0aW9uIGlzIHVzZWQgYXMgYSBwYXJhbWV0ZXIgdG8gdGhlDQogIEFDRV9jb25maWd1cmVfc2RkKCkgZnVuY3Rpb24gdG8gc3BlY2lmeSBpbmRpdmlkdWFsIG9yIHN5bmNocm9ub3VzIHVwZGF0aW5nIG9mDQogIHRoZSBTaWdtYSBEZWx0YSBEQUNzLg0KICovDQp0eXBlZGVmIGVudW0NCnsNCiAgICBJTkRJVklEVUFMX1VQREFURSA9IDAsDQogICAgU1lOQ19VUERBVEUgPSAxDQp9IHNkZF91cGRhdGVfbWV0aG9kX3Q7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfY29uZmlndXJlX3NkZCgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBvcGVyYXRpbmcgbW9kZSBvZg0KICB0aGUgU2lnbWEgRGVsdGEgREFDIChTREQpIHNwZWNpZmllZCBhcyBwYXJhbWV0ZXIuIEl0IGFsbG93cyBzZWxlY3Rpbmcgd2hldGhlciB0aGUNCiAgU0REIHdpbGwgb3V0cHV0IGEgdm9sdGFnZSBvciBhIGN1cnJlbnQuIEEgY3VycmVudCBiZXR3ZWVuIDAgYW5kIDI1NnVBIGlzDQogIGdlbmVyYXRlZCBpbiBjdXJyZW50IG1vZGUuIEEgdm9sdGFnZSBiZXR3ZWVuIDAgYW5kIDIuNTZWIGlzIGdlbmVyYXRlZCBpbg0KICB2b2x0YWdlIG1vZGUuDQogIFRoaXMgZnVuY3Rpb24gYWxzbyBhbGxvd3Mgc2VsZWN0aW5nIHdoZXRoZXIgUmV0dXJuIFRvIFplcm8gKFJUWikgbW9kZSBpcw0KICBlbmFibGVkIG9yIG5vdC4gRW5hYmxpbmcgUmV0dXJuIFRvIFplcm8gbW9kZSBpbXByb3ZlcyBsaW5lYXJpdHkgb2YgdGhlIFNERA0KICBvdXRwdXQgYXQgdGhlIGRldHJpbWVudCBvZiBhY2N1cmFjeS4gVGhpcyBtb2RlIHNob3VsZCBiZSB1c2VkIGlmIGxpbmVhcml0eSBpcw0KICBtb3JlIGltcG9ydGFudCB0aGFuIGFjY3VyYWN5Lg0KICBBIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiBpcyBub3QgcmVxdWlyZWQgaWYgcmVseWluZyBvbiB0aGUgY29uZmlndXJhdGlvbg0KICBzZWxlY3RlZCBpbiB0aGUgQUNFIGNvbmZpZ3VyYXRvciBiZWluZyBsb2FkZWQgYWZ0ZXIgcmVzZXQgYnkgdGhlIHN5c3RlbSBib290Lg0KDQogIEBwYXJhbSBzZGRfaWQNCiAgICBUaGUgc2RkX2lkIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hpY2ggU2lnbWEgRGVsdGEgREFDIGlzIGNvbmZpZ3VyZWQgYnkgdGhpcw0KICAgIGZ1bmN0aW9uLiBBbGxvd2VkIHZhbHVlcyBhcmU6DQogICAgICAgIC0gU0REMF9PVVQNCiAgICAgICAgLSBTREQxX09VVA0KICAgICAgICAtIFNERDJfT1VUDQoNCiAgQHBhcmFtIHJlc29sdXRpb24NCiAgICBUaGUgcmVzb2x1dGlvbiBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHJlc29sdXRpb24gb2YgdGhlIFNpZ21hIERlbHRhIERBQy4NCiAgICBBbGxvd2VkIHZhbHVlcyBhcmU6DQogICAgICAgIC0gU0REXzhfQklUUw0KICAgICAgICAtIFNERF8xNl9CSVRTDQogICAgICAgIC0gU0REXzI0X0JJVFMNCg0KICBAcGFyYW0gbW9kZQ0KICAgIFRoZSBtb2RlIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIG9wZXJhdGluZyBtb2RlIG9mIHRoZSBTaWdtYSBEZWx0YSBEQUMuIEl0DQogICAgc3BlY2lmaWVzIHdoZXRoZXIgYSBjdXJyZW50IG9yIHZvbHRhZ2Ugc2hvdWxkIGJlIGdlbmVyYXRlZCBhbmQgd2hldGhlcg0KICAgIFJldHVybiB0byBaZXJvIG1vZGUgc2hvdWxkIGJlIHVzZWQuIEl0IGlzIGEgbG9naWNhbCBPUiBvZiB0aGUgZm9sbG93aW5nDQogICAgZGVmaW5lczoNCiAgICAgICAgLSBTRERfQ1VSUkVOVF9NT0RFDQogICAgICAgIC0gU0REX1ZPTFRBR0VfTU9ERQ0KICAgICAgICAtIFNERF9SRVRVUk5fVE9fWkVSTw0KICAgICAgICAtIFNERF9OT05fUlRaDQoNCiAgQHBhcmFtIHN5bmNfdXBkYXRlDQogICAgVGhlIHN5bmNfdXBkYXRlIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hldGhlciB0aGUgU0REIG91dHB1dCB3aWxsIGJlIHVwZGF0ZWQNCiAgICBpbmRpdmlkdWFsbHkgdGhvdWdoIGEgY2FsbCB0byBBQ0Vfc2V0X3NkZF92YWx1ZSgpIG9yIHN5bmNocm9ub3VzbHkgd2l0aCBvbmUNCiAgICBvciBtb3JlIG90aGVyIFNERCBvdXRwdXRzIHZpYSBhIGNhbGwgdG8gQUNFX3NldF9zZGRfdmFsdWVfc3luYygpLg0KDQogIEV4YW1wbGUNCiAgQGNvZGUNCiAgICBBQ0VfY29uZmlndXJlX3NkZA0KICAgICgNCiAgICAgICAgU0REMV9PVVQsDQogICAgICAgIFNERF8yNF9CSVRTLA0KICAgICAgICBTRERfVk9MVEFHRV9NT0RFIHwgU0REX1JFVFVSTl9UT19aRVJPLA0KICAgICAgICBJTkRJVklEVUFMX1VQREFURQ0KICAgICk7DQogIEBlbmRjb2RlDQogKi8NCnZvaWQgQUNFX2NvbmZpZ3VyZV9zZGQNCigNCglzZGRfaWRfdCAgICAgICAgICAgIHNkZF9pZCwNCglzZGRfcmVzb2x1dGlvbl90ICAgIHJlc29sdXRpb24sDQogICAgdWludDhfdCAgICAgICAgICAgICBtb2RlLA0KICAgIHNkZF91cGRhdGVfbWV0aG9kX3Qgc3luY191cGRhdGUNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfZW5hYmxlX3NkZCgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZW5hYmxlIGEgU2lnbWEgRGVsdGEgREFDLg0KDQogIEBwYXJhbSBzZGRfaWQNCiAgICBUaGUgc2RkX2lkIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIFNpZ21hIERlbHRhIERBQyB0byBlbmFibGUuDQogKi8NCnZvaWQgQUNFX2VuYWJsZV9zZGQNCigNCglzZGRfaWRfdCAgICBzZGRfaWQNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfZGlzYWJsZV9zZGQoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGRpc2FibGUgYSBTaWdtYSBEZWx0YSBEQUMuDQoNCiAgQHBhcmFtIHNkZF9pZA0KICAgIFRoZSBzZGRfaWQgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgU2lnbWEgRGVsdGEgREFDIHRvIGRpc2FibGUuDQogKi8NCnZvaWQgQUNFX2Rpc2FibGVfc2RkDQooDQoJc2RkX2lkX3QgICAgc2RkX2lkDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgQUNFX3NldF9zZGRfdmFsdWUoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgdmFsdWUgb2YgdGhlIG91dHB1dCBvZg0KICBhIFNpZ21hIERlbHRhIERBQy4gSXQgdXNlcyB0aGUgQUNFJ3MgcGhhc2UgYWNjdW11bGF0b3IgdG8gZ2VuZXJhdGUgdGhlIG9uZSBiaXQNCiAgaW5wdXQgYml0IHN0cmVhbSBpbnRvIHRoZSBTREQgd2hpY2ggd2lsbCBpbiB0dXJuIGRlZmluZSB0aGUgdm9sdGFnZSBvcg0KICBjdXJyZW50IGdlbmVyYXRlZCBhdCB0aGUgU0REIG91dHB1dC4NCiAgVGhlIFNERCBvdXRwdXQgaXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBzZGRfdmFsdWUgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gdGFraW5nDQogIHRoZSBTREQgcmVzb2x1dGlvbiBpbnRvIGFjY291bnQuIEEgbWF4aW11bSB2b2x0YWdlIG9mIDIuNTZWIG9yIGEgbWF4aW11bQ0KICBjdXJyZW50IG9mIDI1NnVBIHdpbGwgYmUgZ2VuZXJhdGVkIHdoZW4gdGhlIHNkZF92YWx1ZSBpcyBzZXQgdGhlIG1heGltdW0gdmFsdWUNCiAgYWxsb3dlZCBieSB0aGUgU0REIHJlc29sdXRpb24NCg0KICBAcGFyYW0gc2RkX2lkDQogICAgVGhlIHNkZF9pZCBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoaWNoIFNpZ21hIERlbHRhIERBQyBpcyBiZWluZyBzZXQuDQoNCiAgQHBhcmFtIHNkZF92YWx1ZQ0KICAgIFRoZSBzZGRfdmFsdWUgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgdmFsdWUgb2YgdGhlIFNpZ21hIERlbHRhIERBQyBvdXRwdXQuDQogICAgSXQgaXMgYSBmcmFjdGlvbiBvZiBTREQgcmVzb2x1dGlvbi4gVGhlIHZvbHRhZ2UvY3VycmVudCB2YWx1ZSBnZW5lcmF0ZWQgZnJvbQ0KICAgIHRoZSBzZGRfdmFsdWUgcGFyYW1lbnRlciBjYW4gYmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgZm9sbG93aW5nIGVxdWF0aW9uIHdoZXJlDQogICAgc2RkX3Jlc29sdXRpb24gaXMgdGhlIHJlc29sdXRpb24gb2YgdGhlIFNERCBhcyBzZXQgdGhyb3VnaCBmdW5jdGlvbg0KICAgIEFDRV9jb25maWd1cmVfc2RkKCkgYW5kIHNkZF9yYW5nU0REIGNvbmZpZ3VyYXRpb246DQogICAgICAgIHNkZF9vdXRwdXQgPSAoc2RkX3ZhbHVlIC8gc2RkX3Jlc29sdXRpb24pICogc2RkX3JhbmdlDQogKi8NCnZvaWQgQUNFX3NldF9zZGRfdmFsdWUNCigNCglzZGRfaWRfdCAgICBzZGRfaWQsDQoJdWludDMyX3QgICAgc2RkX3ZhbHVlDQopOw0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoaXMgY29uc3RhbnQgZGVmaW5pdGlvbiBpcyB1c2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBBQ0Vfc2V0X3NkZF92YWx1ZV9zeW5jKCkNCiAgZnVuY3Rpb24gdG8gc3BlY2lmeSB0aGF0IHRoZSBvdXRwdXQgdmFsdWUgb2YgU0REMCwgb3IgU0REMSwgb3IgU0REMiBzaG91bGQgbm90DQogIGJlIG1vZGlmaWVkLg0KICovDQojZGVmaW5lIFNERF9OT19VUERBVEUgICAweEZGRkZGRkZGDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0Vfc2V0X3NkZF92YWx1ZV9zeW5jKCkgZnVuY3Rpb24gaXMgdXNlZCB0byBzeW5jaHJvbml6ZSB0aGUgdXBkYXRlIG9mDQogIG11bHRpcGxlIFNpZ21hIERlbHRhIERBQyBvdXRwdXRzLg0KDQogIEBwYXJhbSBzZGQwX3ZhbHVlDQogICAgVGhlIHNkZDBfdmFsdWUgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gc2V0IHRoZQ0KICAgIG91dHB1dCBvZiBTREQwLg0KICAgIFRoZSBkZWZpbmUgU0REX05PX1VQREFURSBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoYXQgdGhlIG91dHB1dCB2YWx1ZSBvZg0KICAgIFNERDAgc2hvdWxkIG5vdCBiZSBtb2RpZmllZC4NCg0KICBAcGFyYW0gc2RkMV92YWx1ZQ0KICAgIFRoZSBzZGQxX3ZhbHVlIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHNldCB0aGUNCiAgICBvdXRwdXQgb2YgU0REMS4NCiAgICBUaGUgZGVmaW5lIFNERF9OT19VUERBVEUgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGF0IHRoZSBvdXRwdXQgdmFsdWUgb2YNCiAgICBTREQxIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuDQoNCiAgQHBhcmFtIHNkZDJfdmFsdWUNCiAgICBUaGUgc2RkMl92YWx1ZSBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBzZXQgdGhlDQogICAgb3V0cHV0IG9mIFNERDIuDQogICAgVGhlIGRlZmluZSBTRERfTk9fVVBEQVRFIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhhdCB0aGUgb3V0cHV0IHZhbHVlIG9mDQogICAgU0REMiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLg0KDQogIEZvciBleGFtcGxlIHRoZSBjb2RlIGJlbG93IHdpbGwgY2hhbmdlIHRoZSBvdXRwdXQgdmFsdWUgb2YgU0REMCBhbmQgU0REMiBzbw0KICB0aGF0IHRoZSB2b2x0YWdlL2N1cnJlbnQgZ2VuZXJhdGUgYnkgU0REMCBhbmQgQUREMiB3aWxsIGNoYW5nZSBhdCB0aGUgc2FtZQ0KICB0aW1lLiBUaGlzIGZ1bmN0aW9uIGNhbGwgd2lsbCBub3QgYWZmZWN0IHRoZSBvdXRwdXQgdmFsdWUgb2YgU0REMS4NCiAgQGNvZGUNCiAgICB1aW50MzJfdCBzZGQwX3ZhbHVlID0gMHgxMjM0Ow0KICAgIHVpbnQzMl90IHNkZDJfdmFsdWUgPSAweDU2Nzg7DQogICAgQUNFX3NldF9zZGRfdmFsdWVfc3luYyggc2RkMF92YWx1ZSwgU0REX05PX1VQREFURSwgc2RkMl92YWx1ZSApOw0KICBAZW5kY29kZQ0KICovDQoNCnZvaWQgQUNFX3NldF9zZGRfdmFsdWVfc3luYw0KKA0KICAgIHVpbnQzMl90IHNkZDBfdmFsdWUsDQogICAgdWludDMyX3Qgc2RkMV92YWx1ZSwNCiAgICB1aW50MzJfdCBzZGQyX3ZhbHVlDQopOw0KDQovKiogQH0gKi8NCg0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiA9PT09PT09PT09PT0gUmVhZGluZyBTYW1wbGVzIGZyb20gcG9zdCBwcm9jZXNzaW5nIGVuZ2luZSAoUFBFKSA9PT09PT09PT09PT09PT09DQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8vKioNCiAgQGRlZmdyb3VwIGdyb3VwOSBSZWFkaW5nIEFuYWxvZyBJbnB1dCBDaGFubmVscyBWYWx1ZXMgYW5kIFByb3BlcnRpZXMNCiAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gYWNjZXNzIGFuYWxvZyBpbnB1dCBjaGFubmVscyBwcm9wZXJ0aWVzDQogIGFuZCBzYW1wbGVkIHZhbHVlcy4NCiAgQHsNCiAqLy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoaXMgY29uc3RhbnQgcmV0dXJuZWQgYnkgdGhlIEFDRV9nZXRfZmxhZ19jaGFubmVsKCksIEFDRV9nZXRfY2hhbm5lbF9oYW5kbGUoKQ0KICBhbmQgQUNFX2dldF9pbnB1dF9jaGFubmVsX2hhbmRsZSgpIGZ1bmN0aW9ucyB3aGVuIHRoZSBkcml2ZXIgY2FuknQgZmluZCBhDQogIHZhbGlkIGhhbmRsZSBmb3IgdGhlIEFEQyBpbnB1dCBjaGFubmVsLg0KICovDQojZGVmaW5lIElOVkFMSURfQ0hBTk5FTF9IQU5ETEUgICAgICBOQl9PRl9BQ0VfQ0hBTk5FTF9IQU5ETEVTDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfZ2V0X2NoYW5uZWxfaGFuZGxlKCkgZnVuY3Rpb24gcmV0dXJucyB0aGUgY2hhbm5lbCBoYW5kbGUgYXNzb2NpYXRlZA0KICB3aXRoIGFuIGFuYWxvZyBpbnB1dCBjaGFubmVsIG5hbWUuIFRoZSByZXRyaWV2ZWQgY2hhbm5lbCBoYW5kbGUgd2lsbCBiZQ0KICBzdWJzZXF1ZW50bHkgdXNlZCBhcyBwYXJhbWV0ZXIgdG8gZnVuY3Rpb24gQUNFX2dldF9wcGVfc2FtcGxlKCkgdXNlZCB0byByZWFkDQogIHRoZSBtb3N0IHJlY2VudCBwb3N0IHByb2Nlc3NlZCBzYW1wbGUgZm9yIHRoZSBhbmFsb2cgaW5wdXQgaWRlbnRpZmllZCB0aHJvdWdoDQogIHRoZSBjaGFubmVsL3NlcnZpY2UgbmFtZSBwYXNzZWQgYXMgYXJndW1lbnQgdG8gdGhpcyBmdW5jdGlvbi4NCg0KICBAcGFyYW0gcF9zel9jaGFubmVsX25hbWUNCiAgICBUaGUgcF9zel9jaGFubmVsX25hbWUgcGFyYW1ldGVyIGlzIGEgemVyby10ZXJtaW5hdGVkIHN0cmluZyBjb250YWluaW5nIHRoZQ0KICAgIG5hbWUgb2YgdGhlIGNoYW5uZWwvc2VydmljZSBhcyBlbnRlcmVkIGluIHRoZSBBQ0UgY29uZmlndXJhdG9yLg0KDQogIEByZXR1cm4NCiAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBjaGFubmVsIGhhbmRsZS4gVGhpcyBjaGFubmVsIGhhbmRsZSBpcyByZXF1aXJlZCBhcw0KICAgIHBhcmFtZXRlciB0byBmdW5jdGlvbiBBQ0VfZ2V0X3BwZV9zYW1wbGUoKS4NCiAgICBJdCB3aWxsIHJldHVybiBJTlZBTElEX0NIQU5ORUxfSEFORExFIGlmIHRoZSBjaGFubmVsL3NlcnZpY2UgbmFtZSBpcyBub3QNCiAgICByZWNvZ25pemVkLg0KDQogIEBjb2RlDQogICAgdWludDE2X3QgYWRjX3Jlc3VsdDsNCiAgICBhY2VfY2hhbm5lbF9oYW5kbGVfdCBhdDA7DQogICAgYXQwID0gQUNFX2dldF9jaGFubmVsX2hhbmRsZSgiVm9sdGFnZU1vbml0b3JBVDAiKTsNCiAgICBhZGNfcmVzdWx0ID0gQUNFX2dldF9wcGVfc2FtcGxlKCBhdDAgKTsNCiAgQGVuZGNvZGUNCiAqLw0KYWNlX2NoYW5uZWxfaGFuZGxlX3QNCkFDRV9nZXRfY2hhbm5lbF9oYW5kbGUNCigNCiAgICBjb25zdCB1aW50OF90ICogcF9zel9jaGFubmVsX25hbWUNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfZ2V0X2lucHV0X2NoYW5uZWxfaGFuZGxlKCkgZnVuY3Rpb24gcmV0dXJucyB0aGUgY2hhbm5lbCBoYW5kbGUgZm9yDQogIHRoZSBoYXJkd2FyZSBhbmFsb2cgaW5wdXQgY2hhbm5lbCBzcGVjaWZpZWQgYXMgcGFyYW1ldGVyLg0KDQogIEBwYXJhbSBjaGFubmVsX2lkDQogICAgVGhlIGNoYW5uZWxfaWQgcGFyYW1ldGVyIGlkZW50aWZpZXMgYSBoYXJkd2FyZSBhbmFsb2cgaW5wdXQgb2YgdGhlIEFDRS4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgY2hhbm5lbCBoYW5kbGUuIFRoaXMgY2hhbm5lbCBoYW5kbGUgaXMgcmVxdWlyZWQgYXMNCiAgICBwYXJhbWV0ZXIgdG8gb3RoZXIgQUNFIGRyaXZlciBmdW5jdGlvbnMgZGVhbGluZyB3aXRoIGFuYWxvZyBpbnB1dHMuDQogICAgSXQgd2lsbCByZXR1cm4gSU5WQUxJRF9DSEFOTkVMX0hBTkRMRSBpZiB0aGUgY2hhbm5lbCBJRCBwYXNzZWQgYXMgcGFyYW1ldGVyDQogICAgaXMgaW52YWxpZC4NCiAqLw0KYWNlX2NoYW5uZWxfaGFuZGxlX3QNCkFDRV9nZXRfaW5wdXRfY2hhbm5lbF9oYW5kbGUNCigNCiAgICBhZGNfY2hhbm5lbF9pZF90ICAgIGNoYW5uZWxfaWQNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfZ2V0X3BwZV9zYW1wbGUoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlYWQgdGhlIG1vc3QgcmVjZW50IHBvc3QNCiAgcHJvY2Vzc2VkIHNhbXBsZSBmb3IgdGhlIGFuYWxvZyBpbnB1dCBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2hhbm5lbA0KICBoYW5kbGUgcGFzc2VkIGFzIHBhcmFtZXRlci4NCg0KICBAcGFyYW0gY2hhbm5lbF9oYW5kbGUNCiAgICBUaGUgY2hhbm5lbF9oYW5kbGUgcGFyYW1ldGVyIGlkZW50aWZpZXMgdGhlIGFuYWxvZyBpbnB1dCBjaGFubmVsIGZvciB3aGljaA0KICAgIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIG1vc3QgcmVjZW50IEFEQyBjb252ZXJzaW9uIHJlc3VsdCBhZGp1c3RlZCBmb3INCiAgICBjYWxpYnJhdGlvbiBhbmQgdXNlciBwcm92aWRlZCBjb2VmZmljaWVudHMgYXMgcHJvdmlkZWQgdGhyb3VnaCB0aGUgQUNFDQogICAgY29uZmlndXJhdG9yLiBUaGUgYXZhaWxhYmxlIGNoYW5uZWwgaGFuZGxlIHZhbHVlcyBjYW4gYmUgZm91bmQgaW4gdGhlDQogICAgYWNlX2hhbmRsZXMuaCBmaWxlIGxvY2F0ZWQgaW4gdGhlIC4vZHJpdmVyc19jb25maWcvbXNzX2FjZSBzdWJkaXJlY3RvcnkuIFRoZQ0KICAgIGNoYW5uZWwgaGFuZGxlIHZhbHVlIGNhbiBhbHNvIGJlIHJldHJpZXZlZCB0aHJvdWdoIGEgY2FsbCB0bw0KICAgIEFDRV9nZXRfY2hhbm5lbF9oYW5kbGUoKSB3aGVuIHRoZSBuYW1lIG9mIHRoZSBjaGFubmVsIGlzIGtub3duLCBvciBieQ0KICAgIGl0ZXJhdGluZyB0aG91Z2ggYWxsIGFuYWxvZyBpbnB1dCBjaGFubmVsIHVzaW5nIHRoZSBBQ0VfZ2V0X2ZpcnN0X2NoYW5uZWwoKQ0KICAgIGFuZCBBQ0VfZ2V0X25leHRfY2hhbm5lbCgpLg0KDQogIEByZXR1cm4NCiAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSAxNiBiaXQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBhZGp1c3RlZCB2YWx1ZSBvZiB0aGUNCiAgICBBREMgY29udmVyc2lvbiByZXN1bHQgZm9yIHRoZSBhbmFsb2cgaW5wdXQgY2hhbm5lbCBpZGVudGlmaWVkIGJ5IHRoZSBjaGFubmVsDQogICAgaGFuZGxlIHBhc3NlZCBhcyBwYXJhbWV0ZXIuIFRoZSByZXR1cm4gdmFsdWUgaXMgYWN0dWFsbHkgYSAxMiwgMTAgb3IgOCBiaXRzDQogICAgbnVtYmVyIGRlcGVuZGluZyBvbiB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgQURDLg0KDQogIEBjb2RlDQogICAgdWludDE2X3QgYWRjX3Jlc3VsdDsNCiAgICBhY2VfY2hhbm5lbF9oYW5kbGVfdCBhdDA7DQogICAgYXQwID0gQUNFX2dldF9jaGFubmVsX2hhbmRsZSgiVm9sdGFnZU1vbml0b3JBVDAiKTsNCiAgICBhZGNfcmVzdWx0ID0gQUNFX2dldF9wcGVfc2FtcGxlKCBhdDAgKTsNCiAgQGVuZGNvZGUNCiAqLw0KdWludDE2X3QNCkFDRV9nZXRfcHBlX3NhbXBsZQ0KKA0KICAgIGFjZV9jaGFubmVsX2hhbmRsZV90IGNoYW5uZWxfaGFuZGxlDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgQUNFX2dldF9jaGFubmVsX25hbWUoKSBmdW5jdGlvbiBwcm92aWRlcyB0aGUgbmFtZSBvZiB0aGUgY2hhbm5lbA0KICBhc3NvY2lhdGVkIHdpdGggdGhlIGNoYW5uZWwgaGFuZGxlIHBhc3NlZCBhcyBwYXJhbWV0ZXIuIFRoZSBjaGFubmVsIG5hbWUgaXMNCiAgdGhlIG5hbWUgdXNlZCBpbiB0aGUgQUNFIGNvbmZpZ3VyYXRvciBzb2Z0d2FyZSB0b29sIHdoZW4gYWRkaW5nIGEgc2VydmljZSB0bw0KICB0aGUgQUNFLg0KDQogIEBwYXJhbSBjaGFubmVsX2hhbmRsZQ0KICAgIFRoZSBjaGFubmVsX2hhbmRsZSBwYXJhbWV0ZXIgaWRlbnRpZmllcyB0aGUgYW5hbG9nIGlucHV0IGNoYW5uZWwgZm9yIHdoaWNoDQogICAgd2Ugd2FudCB0byByZXRyaWV2ZSB0aGUgY2hhbm5lbCBuYW1lLiBUaGUgYXZhaWxhYmxlIGNoYW5uZWwgaGFuZGxlIHZhbHVlcyBjYW4NCiAgICBiZSBmb3VuZCBpbiB0aGUgYWNlX2hhbmRsZXMuaCBmaWxlIGxvY2F0ZWQgaW4gdGhlIC4vZHJpdmVyc19jb25maWcvbXNzX2FjZQ0KICAgIHN1YmRpcmVjdG9yeS4gVGhlIGNoYW5uZWwgaGFuZGxlIHZhbHVlIGNhbiBhbHNvIGJlIHJldHJpZXZlZCB0aHJvdWdoIGEgY2FsbA0KICAgIHRvIEFDRV9nZXRfY2hhbm5lbF9oYW5kbGUoKSB3aGVuIHRoZSBuYW1lIG9mIHRoZSBjaGFubmVsIGlzIGtub3duLCBvciBieQ0KICAgIGl0ZXJhdGluZyB0aG91Z2ggYWxsIGFuYWxvZyBpbnB1dCBjaGFubmVsIHVzaW5nIHRoZSBBQ0VfZ2V0X2ZpcnN0X2NoYW5uZWwoKQ0KICAgIGFuZCBBQ0VfZ2V0X25leHRfY2hhbm5lbCgpLg0KDQogIEByZXR1cm4NCiAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIGEgemVyby10ZXJtaW5hdGVkIHN0cmluZyBjb250YWluaW5nIHRoZQ0KICAgIG5hbWUgb2YgdGhlIGNoYW5uZWwuIEl0IHJldHVybnMgMCBpZiB0aGUgY2hhbm5lbCBoYW5kbGUgcGFzc2VkIGFzIHBhcmFtZXRlcg0KICAgIGlzIG5vdCByZWNvZ25pemVkLg0KICovDQpjb25zdCB1aW50OF90ICogQUNFX2dldF9jaGFubmVsX25hbWUNCigNCiAgICBhY2VfY2hhbm5lbF9oYW5kbGVfdCAgICBjaGFubmVsX2hhbmRsZQ0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIGNoYW5uZWxfdHlwZV90IGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgcXVhbnRpdHkNCiAgbWVhc3VyZWQgYnkgYW4gYW5hbG9nIGlucHV0IGNoYW5uZWwuIEl0IGlzIHR5cGljYWxseSB1c2VkIHRvIGZpZ3VyZSBvdXQgdGhlDQogIHR5cGUgb2YgY29udmVyc2lvbiB0aGF0IG11c3QgYmUgYXBwbGllZCB0byB0aGUgQURDIHZhbHVlIGdlbmVyYXRlZCBmcm9tDQogIHNhbXBsaW5nIGEgY2hhbm5lbCBpbiBvcmRlciB0byB5aWVsZCByZWFsIHdvcmxkIHVuaXRzIHN1Y2ggbWlsbGl2b2x0cywNCiAgbWlsbGlhbXBzIG9yIGRlZ3JlZXMuDQogKi8NCnR5cGVkZWYgZW51bQ0Kew0KICAgIFZPTFRBR0UsDQogICAgQ1VSUkVOVCwNCiAgICBURU1QRVJBVFVSRQ0KfSBjaGFubmVsX3R5cGVfdDsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV9nZXRfY2hhbm5lbF90eXBlKCkgZnVuY3Rpb24gcmV0dXJucyB0aGUgdHlwZSBvZiBpbnB1dCBjaGFubmVsIG9mIHRoZQ0KICBhbmFsb2cgaW5wdXQgY2hhbm5lbCBpZGVudGlmaWVkIGJ5IHRoZSBjaGFubmVsIGhhbmRsZSBwYXNzZWQgYXMgcGFyYW1ldGVyLg0KICBUaGlzIGZ1bmN0aW9uIGFsbG93cyBkZXRlcm1pbmluZyB3aGV0aGVyIHRoZSBxdWFudGl0eSBtZWFzdXJlZCB0aHJvdWdoIHRoZSBBREMNCiAgaXMgYSB2b2x0YWdlLCBjdXJyZW50IG9yIHRlbXBlcmF0dXJlLg0KDQogIEBwYXJhbSBjaGFubmVsX2hhbmRsZQ0KICAgIFRoZSBjaGFubmVsX2hhbmRsZSBwYXJhbWV0ZXIgaWRlbnRpZmllcyBvbmUgb2YgdGhlIGFuYWxvZyBpbnB1dCBjaGFubmVscw0KICAgIG1vbml0b3JlZCBieSB0aGUgQUNFLiBUaGUgYXZhaWxhYmxlIGNoYW5uZWwgaGFuZGxlIHZhbHVlcyBjYW4gYmUgZm91bmQgaW4gdGhlDQogICAgYWNlX2hhbmRsZXMuaCBmaWxlIGxvY2F0ZWQgaW4gdGhlIC5cZHJpdmVyc19jb25maWdcbXNzX2FjZSBzdWJkaXJlY3RvcnkuIFRoZQ0KICAgIGNoYW5uZWwgaGFuZGxlIHZhbHVlIGNhbiBhbHNvIGJlIHJldHJpZXZlZCB0aHJvdWdoIGEgY2FsbCB0bw0KICAgIEFDRV9nZXRfY2hhbm5lbF9oYW5kbGUoKSB3aGVuIHRoZSBuYW1lIG9mIHRoZSBjaGFubmVsIGlzIGtub3duLCBvciBieQ0KICAgIGl0ZXJhdGluZyB0aG91Z2ggYWxsIGFuYWxvZyBpbnB1dCBjaGFubmVsIHVzaW5nIHRoZSBBQ0VfZ2V0X2ZpcnN0X2NoYW5uZWwoKQ0KICAgIGFuZCBBQ0VfZ2V0X25leHRfY2hhbm5lbCgpLg0KDQogIEByZXR1cm4NCiAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIHRvIHJlcG9ydCB0aGUgdHlwZSBvZg0KICAgIHF1YW50aXR5IG1lYXN1cmUgdGhyb3VnaHQgdGhlIGNoYW5uZWw6DQogICAgICAgIC0gVk9MVEFHRQ0KICAgICAgICAtIENVUlJFTlQNCiAgICAgICAgLSBURU1QRVJBVFVSRQ0KICovDQpjaGFubmVsX3R5cGVfdA0KQUNFX2dldF9jaGFubmVsX3R5cGUNCigNCiAgICBhY2VfY2hhbm5lbF9oYW5kbGVfdCAgICBjaGFubmVsX2hhbmRsZQ0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV9nZXRfY2hhbm5lbF9jb3VudCgpIGZ1bmN0aW9uIHJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBjb25maWd1cmVkDQogIGFuYWxvZyBpbnB1dCBjaGFubmVscy4gSXQgaXMgdGhlIG51bWJlciBvZiBjaGFubmVscyBhdmFpbGFibGUgZm9yIHVzZSBhcw0KICBvcHBvc2VkIHRvIHRoZSB0aGVvcmljYWwgbnVtYmVyIG9mIHBoeXNpY2FsIGNoYW5uZWxzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlLg0KDQogIEByZXR1cm4NCiAgICBUaGUgQUNFX2dldF9jaGFubmVsX2NvdW50KCkgZnVuY3Rpb24gcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGlucHV0DQogICAgY2hhbm5lbHMgdGhhdCB3ZXJlIGNvbmZpZ3VyZWQgaW4gdGhlIEFDRSBjb25maWd1cmF0b3IuDQogICAgVGhlIEFDRV9nZXRfY2hhbm5lbF9jb3VudCgpIGZ1bmN0aW9uIHJldHVybnMgMCBpZiBubyBpbnB1dCBjaGFubmVscyB3ZXJlDQogICAgY29uZmlndXJlZC4NCg0KICBAY29kZQ0KICAgIHVpbnQzMl90IGluYzsNCiAgICB1aW50MzJfdCBuYl9vZl9jaGFubmVsczsNCiAgICBhY2VfY2hhbm5lbF9oYW5kbGVfdCBjdXJyZW50X2NoYW5uZWw7DQoNCiAgICBuYl9vZl9jaGFubmVscyA9IEFDRV9nZXRfY2hhbm5lbF9jb3VudCgpOw0KICAgIGN1cnJlbnRfY2hhbm5lbCA9IEFDRV9nZXRfZmlyc3RfY2hhbm5lbCgpOw0KDQogICAgZm9yIChpbmMgPSAwOyBpbmMgPCBuYl9vZl9jaGFubmVsczsgKytpbmMpDQogICAgew0KICAgICAgICBhZGNfcmVzdWx0ID0gQUNFX2dldF9wcGVfc2FtcGxlKCBjdXJyZW50X2NoYW5uZWwgKTsNCiAgICAgICAgZGlzcGxheV92YWx1ZSggY3VycmVudF9jaGFubmVsLCBhZGNfcmVzdWx0ICk7DQogICAgICAgIGN1cnJlbnRfY2hhbm5lbCA9IEFDRV9nZXRfbmV4dF9jaGFubmVsKCBjdXJyZW50X2NoYW5uZWwgKTsNCiAgICB9DQogIEBlbmRjb2RlDQogKi8NCnVpbnQzMl90DQpBQ0VfZ2V0X2NoYW5uZWxfY291bnQNCigNCiAgICB2b2lkDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgQUNFX2dldF9maXJzdF9jaGFubmVsKCkgZnVuY3Rpb24gcmV0dXJucyB0aGUgY2hhbm5lbCBoYW5kbGUgb2Ygb25lIG9mIHRoZQ0KICBjaGFubmVsIGNvbnRyb2xsZWQgYnkgdGhlIEFDRS4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IGl0ZXJhdGluZyB0aG91Z2gNCiAgdGhlIGxpc3Qgb2YgYW5hbG9nIGlucHV0IGNoYW5uZWxzIGhhbmRsZWQgYnkgdGhlIEFDRS4NCg0KICBAcmV0dXJuDQogICAgVGhlIEFDRV9nZXRfZmlyc3RfY2hhbm5lbCgpIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpcnN0IGNoYW5uZWwgaGFuZGxlIGZvdW5kDQogICAgaW4gdGhlIEFDRSBkcml2ZXIncyBpbnRlcm5hbCBjaGFubmVsIGhhbmRsZXMgbGlzdCBvciBJTlZBTElEX0NIQU5ORUxfSEFORExFDQogICAgaWYgdGhlcmUgYXJlIG5vIGNoYW5uZWxzIGRlZmluZWQgaW4gdGhlIEFDRSBjb25maWd1cmF0aW9uLg0KDQogIEBjb2RlDQogICAgdWludDMyX3QgaW5jOw0KICAgIHVpbnQzMl90IG5iX29mX2NoYW5uZWxzOw0KICAgIGFjZV9jaGFubmVsX2hhbmRsZV90IGN1cnJlbnRfY2hhbm5lbDsNCg0KICAgIG5iX29mX2NoYW5uZWxzID0gQUNFX2dldF9jaGFubmVsX2NvdW50KCk7DQogICAgY3VycmVudF9jaGFubmVsID0gQUNFX2dldF9maXJzdF9jaGFubmVsKCk7DQoNCiAgICBmb3IgKGluYyA9IDA7IGluYyA8IG5iX29mX2NoYW5uZWxzOyArK2luYykNCiAgICB7DQogICAgICAgIGFkY19yZXN1bHQgPSBBQ0VfZ2V0X3BwZV9zYW1wbGUoIGN1cnJlbnRfY2hhbm5lbCApOw0KICAgICAgICBkaXNwbGF5X3ZhbHVlKCBjdXJyZW50X2NoYW5uZWwsIGFkY19yZXN1bHQgKTsNCiAgICAgICAgY3VycmVudF9jaGFubmVsID0gQUNFX2dldF9uZXh0X2NoYW5uZWwoIGN1cnJlbnRfY2hhbm5lbCApOw0KICAgIH0NCiAgQGVuZGNvZGUNCiAqLw0KYWNlX2NoYW5uZWxfaGFuZGxlX3QNCkFDRV9nZXRfZmlyc3RfY2hhbm5lbA0KKA0KICAgIHZvaWQNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfZ2V0X25leHRfY2hhbm5lbCgpIHJldHVybnMgdGhlIGNoYW5uZWwgaGFuZGxlIG9mIHRoZSBjaGFubmVsIGZvbGxvd2luZw0KICB0aGUgb25lIHBhc3NlZCBhcyBwYXJhbWV0ZXIuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpdGVyYXRlIHRocm91Z2ggdGhlIGxpc3QNCiAgb2YgYW5hbG9nIGlucHV0IGNoYW5uZWxzIGhhbmRsZWQgYnkgdGhlIEFDRS4NCg0KICBAcGFyYW0gY2hhbm5lbF9oYW5kbGUNCiAgICBUaGUgY2hhbm5lbF9oYW5kbGUgcGFyYW1ldGVyIGlkZW50aWZpZXMgZnJvbSB3aGljaCBjaGFubmVsIHRoZSBkcml2ZXIgc2hvdWxkDQogICAgbG9vayBpbiBpdHMgY2hhbm5lbCBoYW5kbGUgbGlzdCB0byByZXR1cm4gdGhlIG5leHQgY2hhbm5lbCBoYW5kbGUuIFRoZQ0KICAgIGNoYW5uZWxfaGFuZGxlIHBhcmFtZXRlciB3b3VsZCB0eXBpY2FsbHkgYmUgdGhlIGNoYW5uZWwgaGFuZGxlIHJldHVybmVkIGJ5IGENCiAgICBjYWxsIHRvIEFDRV9nZXRfZmlyc3RfY2hhbm5lbCgpIG9yIGEgcHJldmlvdXMgY2FsbCB0byBBQ0VfZ2V0X25leHRfY2hhbm5lbCgpLg0KICAgIE5vdGU6DQogICAgICBUaGUgZmlyc3QgY2FsbCB0byBBQ0VfZ2V0X25leHRfY2hhbm5lbCgpIHdvdWxkIHR5cGljYWxseSB1c2UgdGhlDQogICAgICBjaGFubmVsX2hhbmRsZSByZXR1cm5lZCBieSBhIHByZXZpb3VzIGNhbGwgdG8gQUNFX2dldF9maXJzdF9jaGFubmVsKCkuIFRoZQ0KICAgICAgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IGNhbGxzIHRvIEFDRV9nZXRfbmV4dF9jaGFubmVsKCkgd291bGQgdHlwaWNhbGx5IHVzZQ0KICAgICAgdGhlIGNoYW5uZWxfaGFuZGxlIHJldHVybmVkIGJ5IGEgcHJldmlvdXMgY2FsbCB0byBBQ0VfZ2V0X25leHRfY2hhbm5lbCgpLg0KDQogIEByZXR1cm4NCiAgICBUaGUgQUNFX2dldF9uZXh0X2NoYW5uZWwoKSBmdW5jdGlvbiByZXR1cm5zIHRoZSBjaGFubmVsIGhhbmRsZSBvZiB0aGUgY2hhbm5lbA0KICAgIGZvbGxvd2luZyB0aGUgb25lIHBhc3NlZCBhcyBwYXJhbWV0ZXIgb3IgSU5WQUxJRF9DSEFOTkVMX0hBTkRMRSBpZiB0aGUgZW5kIG9mDQogICAgdGhlIGNoYW5uZWxzIGxpc3QgaGFzIGJlZW4gcmVhY2hlZC4NCg0KICBAY29kZQ0KICAgIHVpbnQzMl90IGluYzsNCiAgICB1aW50MzJfdCBuYl9vZl9jaGFubmVsczsNCiAgICBhY2VfY2hhbm5lbF9oYW5kbGVfdCBjdXJyZW50X2NoYW5uZWw7DQoNCiAgICBuYl9vZl9jaGFubmVscyA9IEFDRV9nZXRfY2hhbm5lbF9jb3VudCgpOw0KICAgIGN1cnJlbnRfY2hhbm5lbCA9IEFDRV9nZXRfZmlyc3RfY2hhbm5lbCgpOw0KDQogICAgZm9yIChpbmMgPSAwOyBpbmMgPCBuYl9vZl9jaGFubmVsczsgKytpbmMpDQogICAgew0KICAgICAgICBhZGNfcmVzdWx0ID0gQUNFX2dldF9wcGVfc2FtcGxlKCBjdXJyZW50X2NoYW5uZWwgKTsNCiAgICAgICAgZGlzcGxheV92YWx1ZSggY3VycmVudF9jaGFubmVsLCBhZGNfcmVzdWx0ICk7DQogICAgICAgIGN1cnJlbnRfY2hhbm5lbCA9IEFDRV9nZXRfbmV4dF9jaGFubmVsKCBjdXJyZW50X2NoYW5uZWwgKTsNCiAgICB9DQogIEBlbmRjb2RlDQogKi8NCmFjZV9jaGFubmVsX2hhbmRsZV90DQpBQ0VfZ2V0X25leHRfY2hhbm5lbA0KKA0KICAgIGFjZV9jaGFubmVsX2hhbmRsZV90IGNoYW5uZWxfaGFuZGxlDQopOw0KDQogLyoqIEB9ICovDQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTU0UgQ29udHJvbCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8vKioNCiAgQGRlZmdyb3VwIGdyb3VwMyBTYW1wbGUgU2VxdWVuY2luZyBFbmdpbmUgQ29udHJvbA0KICBTYW1wbGUgU2VxdWVuY2luZyBFbmdpbmUgY29udHJvbC4NCiAgQHsNCiAqLy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBTYW1wbGUgU2VxdWVuY2luZyBFbmdpbmUgY29udHJvbCBmdW5jdGlvbnMgdXNlIGEgcGFyYW1ldGVyIG9mIHRoaXMgdHlwZSBhcw0KICBhIGhhbmRsZSB0byBpZGVudGlmeSB0aGUgU2FtcGxlIFNlcXVlbmNpbmcgRW5naW5lIChTU0UpIHNlcXVlbmNlcyBjb25maWd1cmVkDQogIHVzaW5nIHRoZSBBQ0UgY29uZmlndXJhdG9yLiBUaGUgQUNFX2dldF9zc2Vfc2VxX2hhbmRsZSgpIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUNCiAgaGFuZGxlIG9mIHRoZSBTU0Ugc2VxdWVuY2UgaWRlbnRpZmllZCBieSB0aGUgc2VxdWVuY2UgbmFtZSBwYXNzZWQgYXMgcGFyYW1ldGVyLg0KICBOb3RlOiBUaGUgQUNFIGNvbmZpZ3VyYXRvciBnZW5lcmF0ZXMgQUNFIGRyaXZlciBjb25maWd1cmF0aW9uIGZpbGVzIGludG8gdGhlDQogICAgICAgIC5cZHJpdmVyc19jb25maWdcbXNzX2FjZSBmb2xkZXIgb2YgdGhlIGZpcm13YXJlIHByb2plY3QuIFRoZXNlIGZpbGVzDQogICAgICAgIGNvbnRhaW4gdGhlIGRldGFpbHMgb2YgdGhlIFNTRSBzZXF1ZW5jZSBoYW5kbGVzIGZvciB5b3VyIEFDRSBjb25maWd1cmF0aW9uLg0KICAgICAgICBUaGUgQUNFIGRyaXZlciBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIHRoZXNlIGZpbGVzIHdoZW4gdGhlDQogICAgICAgIC5cZHJpdmVyc19jb25maWdcbXNzX2FjZSBmb2xkZXIgaXMgcHJlc2VudCBpbiB0aGUgZmlybXdhcmUgcHJvamVjdC4NCiAqLw0KdHlwZWRlZiB1aW50MTZfdCBzc2Vfc2VxdWVuY2VfaGFuZGxlX3Q7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoaXMgY29uc3RhbnQgaXMgcmV0dXJuZWQgYnkgdGhlIEFDRV9nZXRfc3NlX3NlcV9oYW5kbGUoKSBmdW5jdGlvbiB3aGVuIHRoZQ0KICBkcml2ZXIgY2FuknQgZmluZCBhIHZhbGlkIGhhbmRsZSBmb3IgdGhlIFNhbXBsZSBTZXF1ZW5jaW5nIEVuZ2luZSAoU1NFKSBzZXF1ZW5jZS4NCiovDQojZGVmaW5lIElOVkFMSURfU1NFX1NFUV9IQU5ETEUgICAgICAweEZGRkZ1DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfZ2V0X3NzZV9zZXFfaGFuZGxlKCkgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBoYW5kbGUgb2YgdGhlIFNhbXBsZQ0KICBTZXF1ZW5jaW5nIEVuZ2luZSBzZXF1ZW5jZSBpZGVudGlmaWVkIGJ5IHRoZSBzZXF1ZW5jZSBuYW1lIHBhc3NlZCBhcyBwYXJhbWV0ZXIuDQogIFRoZSBzZXF1ZW5jZSBoYW5kbGVyIGNhbiB0aGVuIGJlIHVzZWQgYXMgcGFyYW1ldGVyIHRvIG90aGVyIFNTRSBzZXF1ZW5jZSBjb250cm9sDQogIGZ1bmN0aW9ucyB0byBpZGVudGlmeSB0aGUgc2VxdWVuY2UgdG8gY29udHJvbC4NCg0KICBAcGFyYW0gcF9zel9zZXF1ZW5jZV9uYW1lDQogICAgVGhlIHBfc3pfc2VxdWVuY2VfbmFtZSBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGEgemVyby10ZXJtaW5hdGVkIHN0cmluZw0KICAgIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIHNhbXBsaW5nIHNlcXVlbmNlIGZvciB3aGljaCB3ZSB3YW50IHRvIHJldHJpZXZlDQogICAgdGhlIGhhbmRsZS4NCg0KICBAcmV0dXJuDQogICAgVGhlIEFDRV9nZXRfc3NlX3NlcV9oYW5kbGUoKSBmdW5jdGlvbiByZXR1cm5zIHRoZSBoYW5kbGUgdXNlZCB0byBpZGVudGlmeQ0KICAgIHRoZSBzZXF1ZW5jZSBwYXNzZWQgYXMgcGFyYW1ldGVyIHdpdGggb3RoZXIgQUNFIGRyaXZlciBzYW1wbGluZyBzZXF1ZW5jZQ0KICAgIGNvbnRyb2wgZnVuY3Rpb25zLiBJdCByZXR1cm5zIElOVkFMSURfU1NFX1NFUV9IQU5ETEUgaWYgdGhlIHNlcXVlbmNlIG5hbWUNCiAgICBwYXNzZWQgYXMgcGFyYW1ldGVyIGlzIG5vdCByZWNvZ25pemVkLg0KDQogIEBjb2RlDQogICAgc3NlX3NlcXVlbmNlX2hhbmRsZV90IHNzZV9zZXFfaGFuZGxlOw0KICAgIHNzZV9zZXFfaGFuZGxlID0gQUNFX2dldF9zc2Vfc2VxX2hhbmRsZSgiUHJvY2VkdXJlQSIpOw0KICAgIGlmICggc3NlX3NlcV9oYW5kbGUgIT0gSU5WQUxJRF9TU0VfU0VRX0hBTkRMRSApDQogICAgew0KICAgICAgICBBQ0VfbG9hZF9zc2UoIHNzZV9zZXFfaGFuZGxlICk7DQogICAgICAgIEFDRV9zdGFydF9zc2UoIHNzZV9zZXFfaGFuZGxlICk7DQogICAgfQ0KICBAZW5kY29kZQ0KICovDQpzc2Vfc2VxdWVuY2VfaGFuZGxlX3QNCkFDRV9nZXRfc3NlX3NlcV9oYW5kbGUNCigNCiAgICBjb25zdCB1aW50OF90ICogcF9zel9zZXF1ZW5jZV9uYW1lDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgQUNFX2xvYWRfc3NlKCkgZnVuY3Rpb24gbG9hZHMgdGhlIEFDRSBTYW1wbGUgU2VxdWVuY2luZyBFbmdpbmUgKFNTRSkgUkFNDQogIHdpdGggdGhlIG1pY3JvY29kZSBpbXBsZW1lbnRpbmcgdGhlIHNhbXBsaW5nIHNlcXVlbmNlIGlkZW50aWZpZWQgYnkgdGhlIFNTRQ0KICBzZXF1ZW5jZSBoYW5kbGVyIHBhc3NlZCBhcyBwYXJhbWV0ZXIuDQoNCiAgQHBhcmFtIHNlcXVlbmNlDQogICAgVGhlIHNlcXVlbmNlIHBhcmFtZXRlciBpcyB0aGUgU1NFIHNlcXVlbmNlIGhhbmRsZXIgaWRlbnRpZnlpbmcgdGhlIHNhbXBsaW5nDQogICAgc2VxdWVuY2UgdG8gbG9hZCBpbnRvIHRoZSBBQ0UgU1NFLiBUaGUgdmFsdWUgZm9yIHRoaXMgaGFuZGxlciBpcyByZXRyaWV2ZWQNCiAgICB0aHJvdWdoIGEgY2FsbCB0byBmdW5jdGlvbiBBQ0VfZ2V0X3NzZV9zZXFfaGFuZGxlKCkuDQogKi8NCnZvaWQgQUNFX2xvYWRfc3NlDQooDQogICAgc3NlX3NlcXVlbmNlX2hhbmRsZV90ICBzZXF1ZW5jZQ0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV9zdGFydF9zc2UoKSBmdW5jdGlvbiBjYXVzZXMgdGhlIFNhbXBsaW5nIFNlcXVlbmNlIEVuZ2luZSAoU1NFKSB0byBzdGFydA0KICBleGVjdXRpbmcgdGhlIHNlcXVlbmNlIGlkZW50aWZpZWQgYnkgdGhlIHNlcXVlbmNlIGhhbmRsZXIgcGFzc2VkIGFzIHBhcmFtZXRlci4NCiAgSXQgY2F1c2VzIHRoZSBpbml0aWFpbGl6YXRpb24gcGFydCBvZiB0aGUgc2FtcGxpbmcgc2VxdWVuY2UgdG8gYmUgZXhlY3V0ZWQNCiAgYmVmb3JlIHRoZSBsb29wIHBhcnQgb2YgdGhlIHNlcXVlbmNlIGlzIHN0YXJ0ZWQuDQogIFlvdSBtdXN0IGVuc3VyZSB0aGF0IHRoZSBzYW1wbGluZyBzZXF1ZW5jZSBoYXMgYmVlbiBsb2FkZWQgaW50byB0aGUgQUNFJ3MgU1NFDQogIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uDQoNCiAgQHBhcmFtIHNlcXVlbmNlDQogICAgVGhlIHNlcXVlbmNlIHBhcmFtZXRlciBpcyB0aGUgU1NFIHNlcXVlbmNlIGhhbmRsZXIgaWRlbnRpZnlpbmcgdGhlIHNhbXBsaW5nDQogICAgc2VxdWVuY2UgdG8gbG9hZCBpbnRvIHRoZSBBQ0UgU1NFLiBUaGUgdmFsdWUgZm9yIHRoaXMgaGFuZGxlciBpcyByZXRyaWV2ZWQNCiAgICB0aHJvdWdoIGEgY2FsbCB0byBmdW5jdGlvbiBBQ0VfZ2V0X3NzZV9zZXFfaGFuZGxlKCkuDQogKi8NCnZvaWQgQUNFX3N0YXJ0X3NzZQ0KKA0KICAgIHNzZV9zZXF1ZW5jZV9oYW5kbGVfdCAgc2VxdWVuY2UNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfcmVzdGFydF9zc2UoKSBmdW5jdGlvbiByZXN0YXJ0cyB0aGUgbG9vcCBwYXJ0IG9mIHRoZSBzYW1wbGluZyBzZXF1ZW5jZQ0KICBsb2FkZWQgaW50byB0aGUgQUNFJ3MgU2FtcGxpbmcgU2VxdWVuY2UgRW5naW5lIChTU0UpLiBUaGUgc2FtcGxpbmcgc2VxdWVuY2UNCiAgd2lsbCBiZSByZXN0YXJ0ZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZXF1ZW5jZSBidXQgb21pdGluZyB0aGUNCiAgaW50aWFsaXphdGlvbiBwaGFzZSBvZiB0aGUgc2VxdWVuY2UuDQogIFRoaXMgZnVuY3Rpb24gd291bGQgdHlwaWNhbGx5IGJlIGNhbGxlZCBhZnRlciBzdG9wcGluZyB0aGUgc2FtcGxpbmcgc2VxdWVuY2UNCiAgdXNpbmcgdGhlIEFDRV9zdG9wX3NlZSgpIGZ1bmN0aW9uIG9yIHdpdGggbm9uLXJlcGVhdGluZyBzZXF1ZW5jZXMuDQoNCiAgQHBhcmFtIHNlcXVlbmNlDQogICAgVGhlIHNlcXVlbmNlIHBhcmFtZXRlciBpcyB0aGUgU1NFIHNlcXVlbmNlIGhhbmRsZXIgaWRlbnRpZnlpbmcgdGhlIHNhbXBsaW5nDQogICAgc2VxdWVuY2UgdG8gbG9hZCBpbnRvIHRoZSBBQ0UgU1NFLiBUaGUgdmFsdWUgZm9yIHRoaXMgaGFuZGxlciBpcyByZXRyaWV2ZWQNCiAgICB0aHJvdWdoIGEgY2FsbCB0byBmdW5jdGlvbiBBQ0VfZ2V0X3NzZV9zZXFfaGFuZGxlKCkuDQogKi8NCnZvaWQgQUNFX3Jlc3RhcnRfc3NlDQooDQogICAgc3NlX3NlcXVlbmNlX2hhbmRsZV90ICBzZXF1ZW5jZQ0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV9zdG9wX3NzZSgpIGZ1bmN0aW9uIHN0b3BzIGV4ZWN1dGlvbiBvZiB0aGUgU2FtcGxlIFNlcXVlbmNpbmcgRW5naW5lDQogIChTU0UpIHNlcXVlbmNlIGluZGVudGlmaWVkIGJ5IHRoZSBzZXF1ZW5jZSBoYW5kbGUgcGFzc2VkIGFzIHBhcmFtZXRlci4NCg0KICBAcGFyYW0gc2VxdWVuY2UNCiAgICBUaGUgc2VxdWVuY2UgcGFyYW1ldGVyIGlzIHRoZSBTU0Ugc2VxdWVuY2UgaGFuZGxlIGlkZW50aWZ5aW5nIHRoZSBzYW1wbGluZw0KICAgIHNlcXVlbmNlIHRvIGxvYWQgaW50byB0aGUgQUNFIFNTRS4gVGhlIHZhbHVlIGZvciB0aGlzIGhhbmRsZXIgaXMgcmV0cmlldmVkDQogICAgdGhyb3VnaCBhIGNhbGwgdG8gZnVuY3Rpb24gQUNFX2dldF9zc2Vfc2VxX2hhbmRsZSgpLg0KICovDQp2b2lkIEFDRV9zdG9wX3NzZQ0KKA0KICAgIHNzZV9zZXF1ZW5jZV9oYW5kbGVfdCAgc2VxdWVuY2UNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfcmVzdW1lX3NzZSgpIGZ1bmN0aW9uIGNhdXNlcyB0aGUgU2FtcGxpbmcgU2VxdWVuY2luZyBFbmdpbmUgKFNTRSkNCiAgc2FtcGxpbmcgc2VxdWVuY2UgaWRlbnRpZmllZCBieSB0aGUgc2VxdWVuY2UgaGFuZGxlIHBhc3NlZCBhcyBwYXJhbWV0ZXIgdG8NCiAgcmVzdW1lIGV4ZWN1dGlvbi4gVGhpcyBmdW5jdGlvbiBpcyB0eXBpY2FsbHkgdXNlZCB0byByZXN0YXJ0IGV4ZWN1dGlvbiBvZg0KICBhIHNlcXVlbmNlIGF0IHRoZSBwb2ludCB3aGVyZSBpdCB3YXMgc3RvcHBlZCB0aHJvdWdoIGEgY2FsbCB0byBBQ0Vfc3RvcF9zc2UoKS4NCg0KICBAcGFyYW0gc2VxdWVuY2UNCiAgICBUaGUgc2VxdWVuY2UgcGFyYW1ldGVyIGlzIHRoZSBTU0Ugc2VxdWVuY2UgaGFuZGxlciBpZGVudGlmeWluZyB0aGUgc2FtcGxpbmcNCiAgICBzZXF1ZW5jZSB0byBsb2FkIGludG8gdGhlIEFDRSBTU0UuIFRoZSB2YWx1ZSBmb3IgdGhpcyBoYW5kbGVyIGlzIHJldHJpZXZlZA0KICAgIHRocm91Z2ggYSBjYWxsIHRvIGZ1bmN0aW9uIEFDRV9nZXRfc3NlX3NlcV9oYW5kbGUoKS4NCiAqLw0Kdm9pZCBBQ0VfcmVzdW1lX3NzZQ0KKA0KICAgIHNzZV9zZXF1ZW5jZV9oYW5kbGVfdCAgc2VxdWVuY2UNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfY2xlYXJfc2FtcGxlX3BpcGVsaW5lKCkgZnVuY3Rpb24gY2xlYXJzIHRoZSBBQ0UgaGFyZHdhcmUgb2Ygc2FtcGxlcw0KICBiZWluZyBwcm9jZXNzZWQuIEl0IGNsZWFyIHRoZSB2YXJpb3VzIHN0YWdlcyBpbnZvbHZlZCBpbiB0aGUgcHJvZHVjdGlvbiBvZg0KICBwb3N0IHByb2Nlc3NlZCBzYW1wbGVzIHdpdGhpbiB0aGUgQUNFIGhhcmR3YXJlLiBJdCBpcyBpbnRlbmRlZCBmb3IgdXNlIHdoZW4NCiAgc3dpdGNoaW5nIGJldHdlZW4gc2FtcGxpbmcgc2VxdWVuY2VzIGFuZCB1c2luZyBwZXJpcGhlcmFsIERNQS4gSXQgYXZvaWRzDQogIHJlY2VpdmluZyBzdGFsZSBzYW1wbGVzIGdlbmVyYXRlZCBhcyBhIHJlc3VsdCBvZiBhIHByZXZpb3VzIHNhbXBsaW5nIHNlcXVlbmNlLg0KDQogIFRoZSBleGFtcGxlIGJlbG93IHNob3dzIGhvdyB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGVuc3VyZSB0aGF0IG5vIHNhbXBsZQ0KICBnZW5lcmF0ZWQgYXMgYSByZXN1bHQgb2Ygc2FtcGxpbmcgc2VxdWVuY2Ugc2VxdWVuY2VfYSB3aWxsIGJlIGdlbmVyYXRlZCBvbmNlDQogIHNhbXBsaW5nIHNlcXVlbmNlX2IgaXMgc3RhcnRlZC4gUGxlYXNlIG5vdGUgdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gc3RvcCB0aGUNCiAgU1NFIHVzaW5nIGZ1bmN0aW9uIEFDRV9zdG9wX3NzZSgpIGJlZm9yZSBjYWxsaW5nIEFDRV9jbGVhcl9zYW1wbGVfcGlwZWxpbmUoKQ0KICB0byBlbnN1cmUgc2VxdWVuY2VfYSBpcyBub3QgcmVzdGFydGVkIGFmdGVyIHRoZSBzYW1wbGUgcGlwZWxpbmUgaXMgY2xlYXJlZC4NCiAgQGNvZGUNCiAgICBBQ0Vfc3RvcF9zc2Uoc2VxdWVuY2VfYSk7DQogICAgQUNFX2NsZWFyX3NhbXBsZV9waXBlbGluZSgpOw0KICAgIEFDRV9zdGFydF9zc2Uoc2VxdWVuY2VfYik7DQogIEBlbmRjb2RlDQoNCiAgVGhlIGV4YW1wbGUgYmVsb3cgc2hvd3MgaG93IHRvIGVuc3VyZSB0aGF0IHRoZSBmaXJzdCBzYW1wbGUgcmVhZCB0aHJvdWdoIFBETUENCiAgd2lsbCBiZSBmcm9tIHRoZSBmaXJzdCBjaGFubmVsIGluIHRoZSBzYW1wbGluZyBzZXF1ZW5jZS4NCiAgQGNvZGUNCiAgICBBQ0Vfc3RvcF9zc2Uoc2VxdWVuY2VfYSk7DQogICAgQUNFX2NsZWFyX3NhbXBsZV9waXBlbGluZSgpOw0KICAgIEFDRV9yZXN0YXJ0X3NzZShzZXF1ZW5jZV9hKTsNCiAgICBQRE1BX3N0YXJ0DQogICAgICAoDQogICAgICAgIFBETUFfQ0hBTk5FTF8wLA0KICAgICAgICBQRE1BX0FDRV9QUEVfREFUQU9VVCwNCiAgICAgICAgKHVpbnQzMl90KWdfc2FtcGxlc19idWZmZXJbZ19wZG1hX2J1ZmZlcl9pZHhdLA0KICAgICAgICBTQU1QTEVTX0JVRkZFUl9TSVpFDQogICAgICApOw0KICBAZW5kY29kZQ0KICovDQp2b2lkIEFDRV9jbGVhcl9zYW1wbGVfcGlwZWxpbmUodm9pZCk7DQoNCi8qKiBAfSAqLw0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiA9PT09PT09PT09PT09PT09PT09PT09PT0gU1NFIEludGVycnVwdHMgQ29udHJvbCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8vKioNCiAgQGRlZmdyb3VwIGdyb3VwNCBTYW1wbGUgU2VxdWVuY2luZyBFbmdpbmUgSW50ZXJydXB0cyBDb250cm9sDQogIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGNvbnRyb2wgaW50ZXJydXB0cyBnZW5lcmF0ZWQgZnJvbSB0aGUNCiAgQUNFJ3MgU2FtcGxlIFNlcXVlbmNpbmcgRW5naW5lLiBUaGVzZSBpbnRlcnJ1cHRzIHdvdWxkIHR5cGljYWxseSBiZSB1c2VkIHRvDQogIGRldGVjdCB3aGVuIHZhbGlkIGRhdGEgaXMgYXZhaWxhYmxlIGZyb20gdGhlIEFEQ3MgY29udHJvbGxlZCBieSB0aGUgU1NFIG9yIHRvDQogIGRldGVjdCB0aGUgY29tcGxldGUgb3IgcGFydGlhbCBjb21wbGV0aW9uIG9mIHRoZSBzYW1wbGluZyBzZXF1ZW5jZSB0aHJvdWdoIHRoZQ0KICBpbnNlcnRpb24gb2YgU1NFIHByb2dyYW0gY291bnRlciBnZW5lcmFsIHB1cnBvc2UgaW50ZXJydXB0IGFzc2VydGlvbiBhcyBwYXJ0DQogIG9mIHRoZSBzZXF1ZW5jZS4NCiAgQHsNCiAqLy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBzc2VfaXJxX2lkX3QgZW51bWVyYXRpb24gaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgU2FtcGxlIFNlcXVlbmNpbmcgRW5naW5lDQogIChTU0UpIGludGVycnVwdCBzb3VyY2VzIHRvIHRoZSBTU0UgaW50ZXJydXB0IGNvbnRyb2wgZnVuY3Rpb25zLg0KICovDQp0eXBlZGVmIGVudW0NCnsNCiAgICBQQzBfRkxBRzAgPSAwLA0KICAgIFBDMF9GTEFHMSA9IDEsDQogICAgUEMwX0ZMQUcyID0gMiwNCiAgICBQQzBfRkxBRzMgPSAzLA0KICAgIFBDMV9GTEFHMCA9IDQsDQogICAgUEMxX0ZMQUcxID0gNSwNCiAgICBQQzFfRkxBRzIgPSA2LA0KICAgIFBDMV9GTEFHMyA9IDcsDQogICAgUEMyX0ZMQUcwID0gOCwNCiAgICBQQzJfRkxBRzEgPSA5LA0KICAgIFBDMl9GTEFHMiA9IDEwLA0KICAgIFBDMl9GTEFHMyA9IDExLA0KICAgIEFEQzBfREFUQVZBTElEID0gMTIsDQogICAgQURDMV9EQVRBVkFMSUQgPSAxMywNCiAgICBBREMyX0RBVEFWQUxJRCA9IDE0LA0KICAgIEFEQzBfQ0FMSUJSQVRJT05fQ09NUExFVEUgPSAxNSwNCiAgICBBREMxX0NBTElCUkFUSU9OX0NPTVBMRVRFID0gMTYsDQogICAgQURDMl9DQUxJQlJBVElPTl9DT01QTEVURSA9IDE3LA0KICAgIEFEQzBfQ0FMSUJSQVRJT05fU1RBUlQgPSAxOCwNCiAgICBBREMxX0NBTElCUkFUSU9OX1NUQVJUID0gMTksDQogICAgQURDMl9DQUxJQlJBVElPTl9TVEFSVCA9IDIwLA0KICAgIE5CX09GX1NTRV9GTEFHX0lSUVMgPSAyMQ0KfSBzc2VfaXJxX2lkX3Q7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfZW5hYmxlX3NzZV9pcnEoKSBmdW5jdGlvbiBlbmFibGVzIHRoZSBTYW1wbGUgU2VxdWVuY2luZyBFbmdpbmUgKFNTRSkNCiAgaW50ZXJydXB0IHNvdXJjZSBzcGVjaWZpZWQgYXMgcGFyYW1ldGVyIHRvIGdlbmVyYXRlIGludGVycnVwdHMuDQoNCiAgQHBhcmFtIHNzZV9pcnFfaWQNCiAgICBUaGUgc3NlX2lycV9pZCBwYXJhbWV0ZXIgaWRlbnRpZmllcyB0aGUgU1NFIGludGVycnVwdCBzb3VyY2UgY29udHJvbGxlZCBieQ0KICAgIHRoaXMgZnVuY3Rpb24uDQogKi8NCnZvaWQgQUNFX2VuYWJsZV9zc2VfaXJxDQooDQoJc3NlX2lycV9pZF90IHNzZV9pcnFfaWQNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfZGlzYWJsZV9zc2VfaXJxKCkgZnVuY3Rpb24gZGlzYWJsZXMgdGhlIFNhbXBsZSBTZXF1ZW5jaW5nIEVuZ2luZQ0KICAoU1NFKSBpbnRlcnJ1cHQgc291cmNlIHNwZWNpZmllZCBhcyBwYXJhbWV0ZXIgZnJvbSBnZW5lcmF0aW5nIGludGVycnVwdHMuDQoNCiAgQHBhcmFtIHNzZV9pcnFfaWQNCiAgICBUaGUgc3NlX2lycV9pZCBwYXJhbWV0ZXIgaWRlbnRpZmllcyB0aGUgU1NFIGludGVycnVwdCBzb3VyY2UgY29udHJvbGxlZCBieQ0KICAgIHRoaXMgZnVuY3Rpb24uDQogKi8NCnZvaWQgQUNFX2Rpc2FibGVfc3NlX2lycQ0KKA0KCXNzZV9pcnFfaWRfdCBzc2VfaXJxX2lkDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgQUNFX2NsZWFyX3NzZV9pcnEoKSBmdW5jdGlvbiBjbGVhcnMgdGhlIFNhbXBsaW5nIFNlcXVlbmNpbmcgRW5naW5lIChTU0UpDQogIGludGVycnVwdCBzcGVjaWZpZWQgYXMgcGFyYW1ldGVyLg0KDQogIEBwYXJhbSBzc2VfaXJxX2lkDQogICAgVGhlIHNzZV9pcnFfaWQgcGFyYW1ldGVyIGlkZW50aWZpZXMgdGhlIFNTRSBpbnRlcnJ1cHQgc291cmNlIGNvbnRyb2xsZWQgYnkNCiAgICB0aGlzIGZ1bmN0aW9uLg0KICovDQp2b2lkIEFDRV9jbGVhcl9zc2VfaXJxDQooDQoJc3NlX2lycV9pZF90IHNzZV9pcnFfaWQNCik7DQoNCi8qKiBAfSAqLw0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IENvbXBhcmF0b3JzIENvbnRyb2wgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8vKioNCiAgQGRlZmdyb3VwIGdyb3VwNSBDb21wYXJhdG9ycyBDb250cm9sDQogIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGFuYWxvZyBjb21wYXJhdG9ycyBpbmNsdWRlZA0KICBpbiB0aGUgU21hcnRGdXNpb24gYW5hbG9nIGJsb2NrLg0KICBUaGUgY29tcGFyYXRvciBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCB0byBkaXJlY3RseSBjb25maWd1cmUgdGhlDQogIGNvbXBhcmF0b3JzLiBUaGVpciB1c2UgaXMgb25seSByZXF1aXJlZCB3aGVuIHRoZSBBQ0UgaXMgbm90IGNvbmZpZ3VyZWQgdXNpbmcNCiAgdGhlIEFDRSBjb25maWd1cmF0b3Igc29mdHdhcmUgdG9vbC4NCiAgVGhlIGNvbXBhcmF0b3IgaW50ZXJydXB0IGNvbnRyb2wgZnVuY3Rpb25zIGFyZSB1c2VkIHJlZ2FyZGxlc3Mgb2YgdGhlIHdheSB0aGUNCiAgQUNFIHdhcyBjb25maWd1cmVkIHRvIGVuYWJsZSwgZGlzYWJsZSBhbmQgY2xlYXIgaW50ZXJydXB0cyBnZW5lcmF0ZWQgd2hlbiB0aGUNCiAgcG9zaXRpdmUgaW5wdXQgb2YgYSBjb21wYXJhdG9yIHJpc2VzIGFib3ZlIG9yIGZhbGxzIGJlbG93IHRoZSBuZWdhdGl2ZSBpbnB1dC4NCiAgQHsNCiAqLy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBjb21wYXJhdG9yX2lkX3QgZW51bWVyYXRpb24gaXMgdXNlZCBieSB0aGUgY29tcGFyYXRvciBjb250cm9sIGZ1bmN0aW9ucw0KICB0byBpZGVudGlmeSB0aGUgYW5hbG9nIGNvbXBhcmF0b3JzIGluY2x1ZGVkIGluIHRoZSBTbWFydEZ1c2lvbiBhbmFsb2cgYmxvY2suDQogKi8NCnR5cGVkZWYgZW51bQ0Kew0KICAgIENNUDAgPSAwLCAgICAgICAgICAgICAgICAgICAvKiE8IEFuYWxvZyBtb2R1bGUgMCwgUXVhZCAwLCBDTUIgY29tcGFyYXRvciAqLw0KICAgIENNUDEgPSAxLCAgICAgICAgICAgICAgICAgICAvKiE8IEFuYWxvZyBtb2R1bGUgMCwgUXVhZCAwLCBUTUIgY29tcGFyYXRvciAqLw0KICAgIENNUDIgPSAyLCAgICAgICAgICAgICAgICAgICAvKiE8IEFuYWxvZyBtb2R1bGUgMCwgUXVhZCAxLCBDTUIgY29tcGFyYXRvciAqLw0KICAgIENNUDMgPSAzLCAgICAgICAgICAgICAgICAgICAvKiE8IEFuYWxvZyBtb2R1bGUgMCwgUXVhZCAxLCBUTUIgY29tcGFyYXRvciAqLw0KICAgIENNUDQgPSA0LCAgICAgICAgICAgICAgICAgICAvKiE8IEFuYWxvZyBtb2R1bGUgMSwgUXVhZCAwLCBDTUIgY29tcGFyYXRvciAqLw0KICAgIENNUDUgPSA1LCAgICAgICAgICAgICAgICAgICAvKiE8IEFuYWxvZyBtb2R1bGUgMSwgUXVhZCAwLCBUTUIgY29tcGFyYXRvciAqLw0KICAgIENNUDYgPSA2LCAgICAgICAgICAgICAgICAgICAvKiE8IEFuYWxvZyBtb2R1bGUgMSwgUXVhZCAxLCBDTUIgY29tcGFyYXRvciAqLw0KICAgIENNUDcgPSA3LCAgICAgICAgICAgICAgICAgICAvKiE8IEFuYWxvZyBtb2R1bGUgMSwgUXVhZCAxLCBUTUIgY29tcGFyYXRvciAqLw0KICAgIENNUDggPSA4LCAgICAgICAgICAgICAgICAgICAvKiE8IEFuYWxvZyBtb2R1bGUgMiwgUXVhZCAwLCBDTUIgY29tcGFyYXRvciAqLw0KICAgIENNUDkgPSA5LCAgICAgICAgICAgICAgICAgICAvKiE8IEFuYWxvZyBtb2R1bGUgMiwgUXVhZCAwLCBUTUIgY29tcGFyYXRvciAqLw0KICAgIENNUDEwID0gMTAsICAgICAgICAgICAgICAgICAvKiE8IEFuYWxvZyBtb2R1bGUgMiwgUXVhZCAxLCBDTUIgY29tcGFyYXRvciAqLw0KICAgIENNUDExID0gMTEsICAgICAgICAgICAgICAgICAvKiE8IEFuYWxvZyBtb2R1bGUgMiwgUXVhZCAxLCBUTUIgY29tcGFyYXRvciAqLw0KICAgIE5CX09GX0NPTVBBUkFUT1JTID0gMTINCn0gY29tcGFyYXRvcl9pZF90Ow0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgY29tcF9oeXN0ZXJlc2lzX3QgZW51bWVyYXRpb24gaXMgdXNlZCBieSB0aGUgQUNFX3NldF9jb21wX2h5c3RlcmVzaXMoKQ0KICBmdW5jdGlvbiB0byBzZXQgdGhlIGh5c3RlcmVzaXMgb2YgdGhlIGFuYWxvZyBjb21wYXJhdG9ycyBpbmNsdWRlZCBpbiB0aGUNCiAgU21hcnRGdXNpb24gYW5hbG9nIGJsb2NrLiBUaGlzIGVudW1lcmF0aW9uIHByb3ZpZGVzIHRoZSBhbGxvd2VkIHZhbHVlcyBvZiB0aGUNCiAgaHlzdGVyZXNpcyBwYXJhbWV0ZXIgb2YgdGhlIEFDRV9zZXRfY29tcF9oeXN0ZXJlc2lzKCkgZnVuY3Rpb24uDQogKi8NCnR5cGVkZWYgZW51bQ0Kew0KICAgIE5PX0hZU1RFUkVTSVMgPSAwLA0KICAgIEhZU1RFUkVTSVNfMTBfTVYgPSAxLA0KICAgIEhZU1RFUkVTSVNfMzBfTVYgPSAyLA0KICAgIEhZU1RFUkVTSVNfMTAwX01WID0gMywNCiAgICBOQl9PRl9IWVNURVJFU0lTID0gNA0KfSBjb21wX2h5c3RlcmVzaXNfdCA7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBjb21wX3JlZmVyZW5jZV90IGVudW1lcmF0aW9uIGlzIHVzZWQgYnkgdGhlIEFDRV9zZXRfY29tcF9yZWZlcmVuY2UoKQ0KICBmdW5jdGlvbiB0byBzZWxlY3QgdGhlIHJlZmVyZW5jZSBpbnB1dCBvZiB0aGUgb2RkIG51bWJlcmVkIGFuYWxvZyBjb21wYXJhdG9ycw0KICBpbmNsdWRlZCBpbiB0aGUgU21hcnRGdXNpb24gYW5hbG9nIGJsb2NrLiBUaGlzIGVudW1lcmF0aW9uIHByb3ZpZGVzIHRoZSBhbGxvd2VkDQogIHZhbHVlcyBvZiB0aGUgcmVmZXJlbmNlIHBhcmFtZXRlciBvZiB0aGUgQUNFX3NldF9jb21wX3JlZmVyZW5jZSAoKSBmdW5jdGlvbi4NCiAqLw0KdHlwZWRlZiBlbnVtDQp7DQogICAgU0REMF9DT01QX1JFRiA9IDAsDQogICAgU0REMV9DT01QX1JFRiA9IDEsDQogICAgU0REMl9DT01QX1JFRiA9IDIsDQogICAgQURDX0lOX0NPTVBfUkVGID0gMywNCiAgICBOQl9PRl9DT01QX1JFRiA9IDQNCn0gY29tcF9yZWZlcmVuY2VfdDsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV9zZXRfY29tcF9yZWZlcmVuY2UoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgcmVmZXJlbmNlIGlucHV0DQogIG9mIGEgdGVtcGVyYXR1cmUgbW9uaXRvciBibG9jayBjb21wYXJhdG9yLiBUaGUgcmVmZXJlbmNlIGlucHV0IG9mIGEgdGVtcGVyYXR1cmUNCiAgbW9uaXRvciBjYW4gYmUgYW4gQURDIGRpcmVjdCBpbnB1dCBvciBvbmUgb2YgdGhlIFNERCdzIG91dHB1dC4NCg0KICBAcGFyYW0gY29tcF9pZA0KICAgIFRoZSBjb21wX2lkIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGNvbXBhcmF0b3IgZm9yIHdoaWNoIHRvIHNlbGVjdCB0aGUNCiAgICByZWZlcmVuY2UgaW5wdXQuIFNpbmNlIG9ubHkgdGVtcGVyYXR1cmUgbW9uaXRvciBibG9jayBjb21wYXJhdG9ycyBoYXZlIGENCiAgICBzZWxlY3RhYmxlIHJlZmVyZW5jZSBpbnB1dCwgYWxsb3dlZCB2YWx1ZXMgYXJlOg0KICAgICAgICAtIENNUDENCiAgICAgICAgLSBDTVAzDQogICAgICAgIC0gQ01QNQ0KICAgICAgICAtIENNUDcNCiAgICAgICAgLSBDTVA5DQogICAgICAgIC0gQ01QMTENCg0KICBAcGFyYW0gcmVmZXJlbmNlDQogICAgVGhlIHJlZmVyZW5jZSBwYXJhbWV0ZXIgc3BlY2lmeSB0aGUgc2lnbmFsIHRoYXQgd2lsbCBiZSB1c2VkIGFzIHJlZmVyZW5jZQ0KICAgIGJ5IHRoZSBjb21wYXJhdG9yLiBBbGxvd2VkIHZhbHVlcyBhcmU6DQogICAgICAgIC0gU0REMF9DT01QX1JFRg0KICAgICAgICAtIFNERDFfQ09NUF9SRUYNCiAgICAgICAgLSBTREQyX0NPTVBfUkVGDQogICAgICAgIC0gQURDX0lOX0NPTVBfUkVGDQogKi8NCnZvaWQgQUNFX3NldF9jb21wX3JlZmVyZW5jZQ0KKA0KICAgIGNvbXBhcmF0b3JfaWRfdCAgICAgY29tcF9pZCwNCiAgICBjb21wX3JlZmVyZW5jZV90ICAgIHJlZmVyZW5jZQ0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV9zZXRfY29tcF9oeXN0ZXJlc2lzKCkgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIGh5c3RlcmVzaXMgb2YgYQ0KICBjb21wYXJhdG9yLiBUaGVyZSBhcmUgZm91ciBwb3NzaWJsZSBoeXN0ZXJlcmlzIHNldHRpbmdzOiBubyBoeXN0ZXJlc2lzLA0KICArLy0xMG1WLCArLy0zMG1WIG9yICsvLTEwMG1WLg0KDQogIEBwYXJhbSBjb21wX2lkDQogICAgVGhlIGNvbXBfaWQgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgY29tcGFyYXRvciBmb3Igd2hpY2ggdGhpcyBmdW5jdGlvbiB3aWxsDQogICAgc2V0IHRoZSBoeXRlcmVzaXMuDQoNCiAgQHBhcmFtIGh5c3RlcmVzaXMNCiAgICBUaGUgaHlzdGVyZXNpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBoeXN0ZXJlc2lzIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvDQogICAgdGhlIGNvbXBhcmF0b3IncyBpbnB1dC4gQWxsb3dlZCB2YWx1ZXMgYXJlOg0KICAgICAgICAtIE5PX0hZU1RFUkVTSVMNCiAgICAgICAgLSBIWVNURVJFU0lTXzEwX01WDQogICAgICAgIC0gSFlTVEVSRVNJU18zMF9NVg0KICAgICAgICAtIEhZU1RFUkVTSVNfMTAwX01WDQoNCiAqLw0Kdm9pZCBBQ0Vfc2V0X2NvbXBfaHlzdGVyZXNpcw0KKA0KCWNvbXBhcmF0b3JfaWRfdCAgICAgY29tcF9pZCwNCiAgICBjb21wX2h5c3RlcmVzaXNfdCAgIGh5c3RlcmVzaXMNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfZW5hYmxlX2NvbXAoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGVuYWJsZSB0aGUgY29tcGFyYXRvciBzcGVjaWZpZWQgYXMNCiAgcGFyYW1ldGVyLg0KDQogIEBwYXJhbSBjb21wX2lkDQogICAgVGhlIGNvbXBfaWQgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGljaCBjb21wYXJhdG9yIHdpbGwgYmUgZW5hYmxlZCBieSBhIGNhbGwNCiAgICB0byB0aGlzIGZ1bmN0aW9uLg0KICovDQp2b2lkIEFDRV9lbmFibGVfY29tcA0KKA0KCWNvbXBhcmF0b3JfaWRfdCBjb21wX2lkDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgQUNFX2Rpc2FibGVfY29tcCgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGlzYWJsZSB0aGUgY29tcGFyYXRvciBzcGVjaWZpZWQgYXMNCiAgcGFyYW1ldGVyLg0KDQogIEBwYXJhbSBjb21wX2lkDQogICAgVGhlIGNvbXBfaWQgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGljaCBjb21wYXJhdG9yIHdpbGwgYmUgZGlzYWJsZWQgYnkgYSBjYWxsDQogICAgdG8gdGhpcyBmdW5jdGlvbi4NCiAqLw0Kdm9pZCBBQ0VfZGlzYWJsZV9jb21wDQooDQoJY29tcGFyYXRvcl9pZF90IGNvbXBfaWQNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfZW5hYmxlX2NvbXBfcmlzZV9pcnEoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGVuYWJsZSBpbnRlcnJ1cHRzIHRvIGJlDQogIGdlbmVyYXRlZCB3aGVuIHRoZSBwb3NpdGl2ZSBpbnB1dCBvZiB0aGUgY29tcGFyYXRvciBzcGVjaWZpZWQgYXMgcGFyYW1ldGVyDQogIHJpc2VzIGFib3ZlIHRoZSBuZWdhdGl2ZSBpbnB1dCBvZiB0aGUgY29tcGFyYXRvci4NCiAgVGhlIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIHRoZSBjb21wYXJhdG9yIHJpc2UgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZXMgYXJlOg0KICAgIC0gdm9pZCBBQ0VfQ29tcDBfUmlzZV9JUlFIYW5kbGVyKCB2b2lkICk7DQogICAgLSB2b2lkIEFDRV9Db21wMV9SaXNlX0lSUUhhbmRsZXIoIHZvaWQgKTsNCiAgICAtIHZvaWQgQUNFX0NvbXAyX1Jpc2VfSVJRSGFuZGxlciggdm9pZCApOw0KICAgIC0gdm9pZCBBQ0VfQ29tcDNfUmlzZV9JUlFIYW5kbGVyKCB2b2lkICk7DQogICAgLSB2b2lkIEFDRV9Db21wNF9SaXNlX0lSUUhhbmRsZXIoIHZvaWQgKTsNCiAgICAtIHZvaWQgQUNFX0NvbXA1X1Jpc2VfSVJRSGFuZGxlciggdm9pZCApOw0KICAgIC0gdm9pZCBBQ0VfQ29tcDZfUmlzZV9JUlFIYW5kbGVyKCB2b2lkICk7DQogICAgLSB2b2lkIEFDRV9Db21wN19SaXNlX0lSUUhhbmRsZXIoIHZvaWQgKTsNCiAgICAtIHZvaWQgQUNFX0NvbXA4X1Jpc2VfSVJRSGFuZGxlciggdm9pZCApOw0KICAgIC0gdm9pZCBBQ0VfQ29tcDlfUmlzZV9JUlFIYW5kbGVyKCB2b2lkICk7DQogICAgLSB2b2lkIEFDRV9Db21wMTBfUmlzZV9JUlFIYW5kbGVyKCB2b2lkICk7DQogICAgLSB2b2lkIEFDRV9Db21wMTFfUmlzZV9JUlFIYW5kbGVyKCB2b2lkICk7DQoNCiAgQHBhcmFtIGNvbXBfaWQNCiAgICBUaGUgY29tcF9pZCBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoaWNoIGNvbXBhcmF0b3Igd2lsbCBiZSBlbmFibGVkIHRvIGdlbmVyYXRlDQogICAgcmlzaW5nIGludGVycnVwdHMuDQogKi8NCnZvaWQgQUNFX2VuYWJsZV9jb21wX3Jpc2VfaXJxDQooDQoJY29tcGFyYXRvcl9pZF90IGNvbXBfaWQNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfZGlzYWJsZV9jb21wX3Jpc2VfaXJxKCkgZnVuY3Rpb24gaXMgdXNlZCB0byBkaXNhYmxlIGludGVycnVwdHMgZnJvbQ0KICBiZWluZyBnZW5lcmF0ZWQgd2hlbiB0aGUgcG9zaXRpdmUgaW5wdXQgb2YgdGhlIGNvbXBhcmF0b3Igc3BlY2lmaWVkIGFzIHBhcmFtZXRlcg0KICByaXNlcyBhYm92ZSB0aGUgbmVnYXRpdmUgaW5wdXQgb2YgdGhlIGNvbXBhcmF0b3IuDQoNCiAgQHBhcmFtIGNvbXBfaWQNCiAgICBUaGUgY29tcF9pZCBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoaWNoIGNvbXBhcmF0b3Igd2lsbCBiZSBkaXNhYmxlZCBmcm9tDQogICAgZ2VuZXJhdGluZyByaXNpbmcgaW50ZXJydXB0cy4NCiAqLw0Kdm9pZCBBQ0VfZGlzYWJsZV9jb21wX3Jpc2VfaXJxDQooDQoJY29tcGFyYXRvcl9pZF90IGNvbXBfaWQNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfY2xlYXJfY29tcF9yaXNlX2lycSgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2xlYXIgcmlzZSBpbnRlcnJ1cHRzLiBUaGlzDQogIGZ1bmN0aW9uIGlzIHR5cGljYWxseSBjYWxsZWQgYXMgcGFydCBvZiB0aGUgcmlzZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLg0KDQogIEBwYXJhbSBjb21wX2lkDQogICAgVGhlIGNvbXBfaWQgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgY29tcGFyYXRvciBmb3Igd2hpY2ggdG8gY2xlYXIgdGhlIHJpc2UNCiAgICBpbnRlcnJ1cHQuDQoNCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICB2b2lkIEFDRV9Db21wMV9SaXNlX0lSUUhhbmRsZXIoIHZvaWQgKQ0KICAgIHsNCiAgICAgICAgcHJvY2Vzc19yaXNlX2lycSgpOw0KICAgICAgICBBQ0VfY2xlYXJfY29tcF9yaXNlX2lycSggQ01QMSApOw0KICAgICAgICBOVklDX0NsZWFyUGVuZGluZ0lSUSggQUNFX0NvbXAxX1Jpc2VfSVJRbiApOw0KICAgIH0NCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZCBBQ0VfY2xlYXJfY29tcF9yaXNlX2lycQ0KKA0KCWNvbXBhcmF0b3JfaWRfdCBjb21wX2lkDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgQUNFX2VuYWJsZV9jb21wX2ZhbGxfaXJxKCkgZnVuY3Rpb24gaXMgdXNlZCB0byBlbmFibGUgaW50ZXJydXB0cyB0byBiZQ0KICBnZW5lcmF0ZWQgd2hlbiB0aGUgcG9zaXRpdmUgaW5wdXQgb2YgdGhlIGNvbXBhcmF0b3Igc3BlY2lmaWVkIGFzIHBhcmFtZXRlcg0KICBmYWxscyBiZWxvdyB0aGUgbmVnYXRpdmUgaW5wdXQgb2YgdGhlIGNvbXBhcmF0b3IuDQogIFRoZSBmdW5jdGlvbiBwcm90b3R5cGVzIGZvciB0aGUgY29tcGFyYXRvciBmYWxsIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmVzIGFyZToNCiAgICAtIHZvaWQgQUNFX0NvbXAwX0ZhbGxfSVJRSGFuZGxlciggdm9pZCApOw0KICAgIC0gdm9pZCBBQ0VfQ29tcDFfRmFsbF9JUlFIYW5kbGVyKCB2b2lkICk7DQogICAgLSB2b2lkIEFDRV9Db21wMl9GYWxsX0lSUUhhbmRsZXIoIHZvaWQgKTsNCiAgICAtIHZvaWQgQUNFX0NvbXAzX0ZhbGxfSVJRSGFuZGxlciggdm9pZCApOw0KICAgIC0gdm9pZCBBQ0VfQ29tcDRfRmFsbF9JUlFIYW5kbGVyKCB2b2lkICk7DQogICAgLSB2b2lkIEFDRV9Db21wNV9GYWxsX0lSUUhhbmRsZXIoIHZvaWQgKTsNCiAgICAtIHZvaWQgQUNFX0NvbXA2X0ZhbGxfSVJRSGFuZGxlciggdm9pZCApOw0KICAgIC0gdm9pZCBBQ0VfQ29tcDdfRmFsbF9JUlFIYW5kbGVyKCB2b2lkICk7DQogICAgLSB2b2lkIEFDRV9Db21wOF9GYWxsX0lSUUhhbmRsZXIoIHZvaWQgKTsNCiAgICAtIHZvaWQgQUNFX0NvbXA5X0ZhbGxfSVJRSGFuZGxlciggdm9pZCApOw0KICAgIC0gdm9pZCBBQ0VfQ29tcDEwX0ZhbGxfSVJRSGFuZGxlciggdm9pZCApOw0KICAgIC0gdm9pZCBBQ0VfQ29tcDExX0ZhbGxfSVJRSGFuZGxlciggdm9pZCApOw0KDQogIEBwYXJhbSBjb21wX2lkDQogICAgVGhlIGNvbXBfaWQgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGljaCBjb21wYXJhdG9yIHdpbGwgYmUgZW5hYmxlZCB0byBnZW5lcmF0ZQ0KICAgIGZhbGwgaW50ZXJydXB0cy4NCiAqLw0Kdm9pZCBBQ0VfZW5hYmxlX2NvbXBfZmFsbF9pcnENCigNCgljb21wYXJhdG9yX2lkX3QgY29tcF9pZA0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV9kaXNhYmxlX2NvbXBfZmFsbF9pcnEoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGRpc2FibGUgaW50ZXJydXB0cyBmcm9tDQogIGJlaW5nIGdlbmVyYXRlZCB3aGVuIHRoZSBwb3NpdGl2ZSBpbnB1dCBvZiB0aGUgY29tcGFyYXRvciBzcGVjaWZpZWQgYXMgcGFyYW1ldGVyDQogIGZhbGxzIGJlbG93IHRoZSBuZWdhdGl2ZSBpbnB1dCBvZiB0aGUgY29tcGFyYXRvci4NCg0KICBAcGFyYW0gY29tcF9pZA0KICAgIFRoZSBjb21wX2lkIHBhcmFtZXRlciBzcGVjaWZpZXMgd2hpY2ggY29tcGFyYXRvciB3aWxsIGJlIGRpc2FibGVkIGZyb20NCiAgICBnZW5lcmF0aW5nIGZhbGwgaW50ZXJydXB0cy4NCiAqLw0Kdm9pZCBBQ0VfZGlzYWJsZV9jb21wX2ZhbGxfaXJxDQooDQoJY29tcGFyYXRvcl9pZF90IGNvbXBfaWQNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfY2xlYXJfY29tcF9mYWxsX2lycSgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2xlYXIgZmFsbCBpbnRlcnJ1cHRzLiBUaGlzDQogIGZ1bmN0aW9uIGlzIHR5cGljYWxseSBjYWxsZWQgYXMgcGFydCBvZiB0aGUgZmFsbCBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLg0KDQogIEBwYXJhbSBjb21wX2lkDQogICAgVGhlIGNvbXBfaWQgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgY29tcGFyYXRvciBmb3Igd2hpY2ggdG8gY2xlYXIgdGhlIGZhbGwNCiAgICBpbnRlcnJ1cHQuDQoNCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICB2b2lkIEFDRV9Db21wMV9GYWxsX0lSUUhhbmRsZXIoIHZvaWQgKQ0KICAgIHsNCiAgICAgICAgcHJvY2Vzc19mYWxsX2lycSgpOw0KICAgICAgICBBQ0VfY2xlYXJfY29tcF9mYWxsX2lycSggQ01QMSApOw0KICAgICAgICBOVklDX0NsZWFyUGVuZGluZ0lSUSggQUNFX0NvbXAxX0ZhbGxfSVJRbiApOw0KICAgIH0NCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZCBBQ0VfY2xlYXJfY29tcF9mYWxsX2lycQ0KKA0KCWNvbXBhcmF0b3JfaWRfdCBjb21wX2lkDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgQUNFX2dldF9jb21wX3N0YXR1cygpIGZ1bmN0aW9uIHJldHVybnMgdGhlIGN1cnJlbnQgY29tcGFyYXRvciBpbnRlcnJ1cHQNCiAgc3RhdHVzLiBJdCByZXR1cm5zIGEgMzIgYml0IHZhbHVlIGluZGljYXRpbmcgd2hpY2ggY29tcGFyYXRvcnMgZXhwZXJpZW5jZWQgYQ0KICBmYWxsIGFuZC9vciByaXNlIGV2ZW50LiBUaGVzZSBzdGF0dXMgYml0cyBjYW4gYmUgY2xlYXJlZCB1c2luZyB0aGUNCiAgQUNFX2NsZWFyX2NvbXBfcmlzZV9pcnEoKSBhbmQgQUNFX2NsZWFyX2NvbXBfZmFsbF9pcnEoKSBmdW5jdGlvbnMuDQoNCiAgQHJldHVybg0KICAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYSAzMiBiaXQgbnVtbmJlciB3aGVyZSBiaXRzIDAgdG8gMTEgaW5kaWNhdGUgd2hpY2gNCiAgICBjb21wYXJhdG9yIGV4cGVyaWVuY2VkIGEgZmFsbCBldmVudCBhbmQgYml0cyAyMSB0byAyMyBpbmRpY2F0ZSB3aGljaA0KICAgIGNvbXBhcmF0b3IgZXhwZXJpZW5jZWQgYSByaXNlIGV2ZW50Lg0KICovDQp1aW50MzJfdCBBQ0VfZ2V0X2NvbXBfc3RhdHVzKCB2b2lkICk7DQoNCi8qKiBAfSAqLw0KDQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KID09PT09PT09PT09PT09PT09PT09PT09PT09IENvbnRyb2xsaW5nIFRocmVzaG9sZHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLy8qKg0KICBAZGVmZ3JvdXAgZ3JvdXA4IENvbnRyb2xsaW5nIEZsYWdzIFRocmVzaG9sZHMNCiAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gZHluYW1pY2FsbHkgY29udHJvbCBQb3N0IFByb2Nlc3NpbmcgRW5naW5lDQogIChQUEUpIGZsYWdzIHRocmVzaGhvbGRzLg0KICBAew0KICovLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV9pc19oeXN0ZXJlc2lzX2ZsYWcoKSBmdW5jdGlvbiBpbmRpY2F0ZXMgaWYgYW4gaHlzdGVyZXNpcyBpcyBhcHBsaWVkDQogIHRvIHRoZSBhbmFsb2cgaW5wdXQgc2FtcGxlIHZhbHVlIHdoZW4gZGV0ZXJtaW5pbmcgdGhlIHN0YXRlIG9mIHRoZSBmbGFnDQogIGlkZW50aWZpZWQgYXMgcGFyYW1ldGVyLg0KDQogIEBwYXJhbSBmbGFnX2hhbmRsZQ0KICAgIFRoZSBmbGFnX2hhbmRsZSBwYXJhbWV0ZXIgaWRlbnRpZmllcyBvbmUgb2YgdGhlIGZsYWdzIGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUNCiAgICB2YWx1ZSBvZiBhbiBhbmFsb2cgaW5wdXQgY2hhbm5lbC4gVGhlIGF2YWlsYWJsZSBmbGFnIGhhbmRsZSB2YWx1ZXMgY2FuIGJlDQogICAgZm91bmQgaW4gdGhlIGFjZV9oYW5kbGVzLmggZmlsZSBsb2NhdGVkIGluIHRoZSAuXGRyaXZlcnNfY29uZmlnXG1zc19hY2UNCiAgICBzdWJkaXJlY3RvcnkuIFRoZSBmbGFnIGhhbmRsZSB2YWx1ZSBjYW4gYWxzbyBiZSByZXRyaWV2ZWQgdGhyb3VnaCBhIGNhbGwgdG8NCiAgICBBQ0VfZ2V0X2ZsYWdfaGFuZGxlKCkgd2hlbiB0aGUgbmFtZSBvZiB0aGUgZmxhZyBpcyBrbm93biwgb3IgYnkgaXRlcmF0aW5nDQogICAgdGhvdWdoIGFsbCBmbGFncyBhc3NvY2lhdGVkIHdpdGggYW4gYW5hbG9nIGlucHV0IGNoYW5uZWwgdXNpbmcgdGhlDQogICAgQUNFX2dldF9jaGFubmVsX2ZpcnN0X2ZsYWcoKSBhbmQgQUNFX2dldF9jaGFubmVsX25leHRfZmxhZygpLg0KDQogIEByZXR1cm4NCiAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZhbHVlIG9uZSBpZiBhIGh5c3RlcmVzaXMgaXMgYXBwbGllZCB0byB0aGUgY2hhbm5lbA0KICAgIHNhbXBsZSB2YWx1ZXMgYXMgcGFydCBvZiBkZXRlcm1pbmluZyB0aGUgc3RhdGUgb2YgdGhlIGZsYWcgaWRlbnRpZmllZCBhcw0KICAgIHBhcmFtZXRlci4gSXQgcmV0dXJucyB6ZXJvIGlmIG5vIGh5c3RlcmVzaXMgaXMgYXBwbGllZC4NCiAqLw0KdWludDMyX3QgQUNFX2lzX2h5c3RlcmVzaXNfZmxhZw0KKA0KICAgIGFjZV9mbGFnX2hhbmRsZV90ICAgZmxhZ19oYW5kbGUNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfaXNfdW5kZXJfZmxhZygpIGZ1bmN0aW9uIGluZGljYXRlcyB3aGV0aGVyIGEgZmxhZyBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUNCiAgbW9uaXRvcmVkIGFuYWxvZyBpbnB1dCBmYWxscyBiZWxvdyB0aGUgZmxhZydzIHRocmVzaG9sZCBsZXZlbCBvciBhYm92ZSB0aGUNCiAgZmxhZydzIHRocmVzaG9sZCBsZXZlbC4NCg0KICBAcGFyYW0gZmxhZ19oYW5kbGUNCiAgICBUaGUgZmxhZ19oYW5kbGUgcGFyYW1ldGVyIGlkZW50aWZpZXMgb25lIG9mIHRoZSBmbGFncyBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlDQogICAgdmFsdWUgb2YgYW4gYW5hbG9nIGlucHV0IGNoYW5uZWwuIFRoZSBhdmFpbGFibGUgZmxhZyBoYW5kbGUgdmFsdWVzIGNhbiBiZQ0KICAgIGZvdW5kIGluIHRoZSBhY2VfaGFuZGxlcy5oIGZpbGUgbG9jYXRlZCBpbiB0aGUgLlxkcml2ZXJzX2NvbmZpZ1xtc3NfYWNlDQogICAgc3ViZGlyZWN0b3J5LiBUaGUgZmxhZyBoYW5kbGUgdmFsdWUgY2FuIGFsc28gYmUgcmV0cmlldmVkIHRocm91Z2ggYSBjYWxsIHRvDQogICAgQUNFX2dldF9mbGFnX2hhbmRsZSgpIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGZsYWcgaXMga25vd24sIG9yIGJ5IGl0ZXJhdGluZw0KICAgIHRob3VnaCBhbGwgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIGFuIGFuYWxvZyBpbnB1dCBjaGFubmVsIHVzaW5nIHRoZQ0KICAgIEFDRV9nZXRfY2hhbm5lbF9maXJzdF9mbGFnKCkgYW5kIEFDRV9nZXRfY2hhbm5lbF9uZXh0X2ZsYWcoKS4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBvbmUgaWYgdGhlIGZsYWcgaWRlbnRpZmllZCBhcyBwYXJhbWV0ZXINCiAgICB0cmlnZ2VycyBhcyBhIHJlc3VsdCBvZiB0aGUgbW9uaXRvcmVkIGlucHV0IGZhbGxpbmcgYmVsb3cgdGhlIGZsYWcncw0KICAgIHRocmVzaG9sZCB2YWx1ZS4NCiAgICBJdCByZXR1cm5zIHplcm8gaWYgdGhlIGZsYWcgdHJpZ2dlcnMgYXMgYSByZXN1bHQgb2YgdGhlIG1vbml0b3JlZCBpbnB1dA0KICAgIGV4Y2VlZGluZyB0aGUgZmxhZydzIHRocmVzaG9sZCB2YWx1ZS4NCiAqLw0KdWludDMyX3QgQUNFX2lzX3VuZGVyX2ZsYWcNCigNCiAgICBhY2VfZmxhZ19oYW5kbGVfdCAgIGZsYWdfaGFuZGxlDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgQUNFX3NldF9mbGFnX3RocmVzaG9sZCgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYWRqdXN0IHRoZSB0aHJlc2hvbGQgZm9yIGENCiAgc3BlY2lmaWMgcG9zdCBwcm9jZXNzaW5nIGVuZ2luZSBnZW5lcmF0ZWQgZmxhZy4gVGhlIGZsYWcgaXMgaWRlbnRpZmllZCB0aHJvdWdoDQogIHRoZSBuYW1lIHNlbGVjdGVkIGluIHRoZSBBQ0UgY29uZmlndXJhdG9yIHNvZnR3YXJlIHRvb2wuDQogIFRoaXMgZnVuY3Rpb24gd2lsbCBzZXQgYSBuZXcgZmxhZ5JzIHRocmVzaG9sZCB2YWx1ZSB3aGlsZSBwcmVzZXJ2aW5nIHRoZQ0KICBoeXN0ZXJlc2lzIHNwZWNpZmllZCBhdCBjb25maWd1cmF0aW9uIHRpbWUgb3IgdGhyb3VnaCBhIGNhbGwgdG8NCiAgQUNFX3NldF9mbGFnX2h5c3RlcmVzaXMoKS4gRm9yIGV4YW1wbGUsIHJlcXVlc3RpbmcgYSAxIHZvbHQgdGhyZXNob2xkIGZvciBhbg0KICBvdmVyIGZsYWcgY29uZmlndXJlZCB3aXRoIGEgMTAwIG1pbGxpdm9sdHMgaHlzdGVyZXNpcyB3aWxsIHJlc3VsdCBpbiB0aGUgZmxhZw0KICBiZWluZyBhc3NlcnRlZCB3aGVuIHRoZSB2b2x0YWdlIHJlYWNoZXMgMS4xIHZvbHRzIGFuZCBkZWFzc2VydGVkIHdoZW4gdGhlDQogIHZvbHRhZ2UgZmFsbHMgYmVsb3cgMC45IHZvbHQuDQoNCiAgQHBhcmFtIGZsYWdfaGFuZGxlDQogICAgVGhlIGZsYWdfaGFuZGxlIHBhcmFtZXRlciBpZGVudGlmaWVzIG9uZSBvZiB0aGUgZmxhZ3MgZ2VuZXJhdGVkIGJhc2VkIG9uIHRoZQ0KICAgIHZhbHVlIG9mIGFuIGFuYWxvZyBpbnB1dCBjaGFubmVsLiBUaGUgYXZhaWxhYmxlIGZsYWcgaGFuZGxlIHZhbHVlcyBjYW4gYmUNCiAgICBmb3VuZCBpbiB0aGUgYWNlX2hhbmRsZXMuaCBmaWxlIGxvY2F0ZWQgaW4gdGhlIC4vZHJpdmVyc19jb25maWcvbXNzX2FjZQ0KICAgIHN1YmRpcmVjdG9yeS4gVGhlIGZsYWcgaGFuZGxlIHZhbHVlIGNhbiBhbHNvIGJlIHJldHJpZXZlZCB0aHJvdWdoIGEgY2FsbCB0bw0KICAgIEFDRV9nZXRfZmxhZ19oYW5kbGUoKSB3aGVuIHRoZSBuYW1lIG9mIHRoZSBmbGFnIGlzIGtub3duLCBvciBieSBpdGVyYXRpbmcNCiAgICB0aG91Z2ggYWxsIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCBhbiBhbmFsb2cgaW5wdXQgY2hhbm5lbCB1c2luZyB0aGUNCiAgICBBQ0VfZ2V0X2NoYW5uZWxfZmlyc3RfZmxhZygpIGFuZCBBQ0VfZ2V0X2NoYW5uZWxfbmV4dF9mbGFnKCkuDQoNCiAgQHBhcmFtIG5ld190aHJlc2hvbGQNCiAgICBUaGUgbmV3X3RocmVzaG9sZCBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBuZXcgdGhyZXNob2xkIGxldmVsIHRoYXQgbXVzdCBiZQ0KICAgIHJlYWNoZWQgaW4gb3JkZXIgZm9yIHRoZSBmbGFnIHRvIGJlIHJhaXNlZC4gVGhlIHZhbHVlIG9mIHRoaXMgcGFyYW1ldGVyIGlzDQogICAgdGhlIHNhbXBsZSB2YWx1ZSByZXN1bHRpbmcgZnJvbSBhIHBvc3QgcHJvY2Vzc2luZyBlbmdpbmUgY29udmVyc2lvbiBvZiB0aGUNCiAgICBkZXNpcmVkIGFuYWxvZyBpbnB1dCB0aHJlc2hvbGQgbGV2ZWwuDQoNCiAgRXhhbXBsZToNCiAgICBUaGUgZnVuY3Rpb24gYmVsb3cgc2V0cyB0aGUgdGhyZXNob2xkIG9mIHRoZSBmbGFnIHNwZWNpZmllZCBhcyBwYXJhbWV0ZXIgdG8NCiAgICAxIHZvbHQuDQogIEBjb2RlDQogICAgdm9pZCBzZXRfdGhyZXNob2xkX3RvXzFWDQogICAgKA0KICAgICAgICBhY2VfZmxhZ19oYW5kbGVfdCBmbGFnX2hhbmRsZQ0KICAgICkNCiAgICB7DQogICAgICAgIHVpbnQxNl90IG5ld190aHJlc2hvbGQ7DQogICAgICAgIGFjZV9jaGFubmVsX2hhbmRsZV90IGNoYW5uZWxfaGFuZGxlOw0KDQogICAgICAgIGNoYW5uZWxfaGFuZGxlID0gQUNFX2dldF9mbGFnX2NoYW5uZWwoZmxhZ19oYW5kbGUpOw0KICAgICAgICBuZXdfdGhyZXNob2xkID0gQUNFX2NvbnZlcnRfZnJvbV9tVihjaGFubmVsX2hhbmRsZSwgMTAwMCk7DQogICAgICAgIEFDRV9zZXRfZmxhZ190aHJlc2hvbGQoZmxhZ19oYW5kbGUsIG5ld190aHJlc2hvbGQpOw0KICAgIH0NCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZCBBQ0Vfc2V0X2ZsYWdfdGhyZXNob2xkDQooDQogICAgYWNlX2ZsYWdfaGFuZGxlX3QgICBmbGFnX2hhbmRsZSwNCiAgICB1aW50MTZfdCAgICAgICAgICAgIG5ld190aHJlc2hvbGQNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0Vfc2V0X2ZsYWdfaHlzdGVyZXNpcygpIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBoeXN0ZXJlc2lzIGFwcGxpZWQgdG8gdGhlDQogIGFuYWxvZyBpbnB1dCBjaGFubmVsIHNhbXBsZSB2YWx1ZXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZmxhZyBzcGVjaWZpZWQgYXMNCiAgcGFyYW1ldGVyLg0KDQogIEBwYXJhbSBmbGFnX2hhbmRsZQ0KICAgIFRoZSBmbGFnX2hhbmRsZSBwYXJhbWV0ZXIgaWRlbnRpZmllcyBvbmUgb2YgdGhlIGZsYWdzIGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUNCiAgICB2YWx1ZSBvZiBhbiBhbmFsb2cgaW5wdXQgY2hhbm5lbC4gVGhlIGF2YWlsYWJsZSBmbGFnIGhhbmRsZSB2YWx1ZXMgY2FuIGJlDQogICAgZm91bmQgaW4gdGhlIGFjZV9oYW5kbGVzLmggZmlsZSBsb2NhdGVkIGluIHRoZSAuXGRyaXZlcnNfY29uZmlnXG1zc19hY2UNCiAgICBzdWJkaXJlY3RvcnkuIFRoZSBmbGFnIGhhbmRsZSB2YWx1ZSBjYW4gYWxzbyBiZSByZXRyaWV2ZWQgdGhyb3VnaCBhIGNhbGwgdG8NCiAgICBBQ0VfZ2V0X2ZsYWdfaGFuZGxlKCkgd2hlbiB0aGUgbmFtZSBvZiB0aGUgZmxhZyBpcyBrbm93biwgb3IgYnkgaXRlcmF0aW5nDQogICAgdGhvdWdoIGFsbCBmbGFncyBhc3NvY2lhdGVkIHdpdGggYW4gYW5hbG9nIGlucHV0IGNoYW5uZWwgdXNpbmcgdGhlDQogICAgQUNFX2dldF9jaGFubmVsX2ZpcnN0X2ZsYWcoKSBhbmQgQUNFX2dldF9jaGFubmVsX25leHRfZmxhZygpLg0KDQogIEBwYXJhbSBhZGNfaHlzdGVyZXNpcw0KICAgIFRoZSBhZGNfaHlzdGVyZXNpcyBwYXJhbWV0ZXIgaXMgdGhlIHZhbHVlIHRvIGFkZCBhbmQgc3VidHJhY3QgdG8gdGhlDQogICAgdGhyZXNob2xkIHZhbHVlIHRvIG9idGFpbiB0aGUgaHlzdGVyZXNpcyBoaWdoIGFuZCBsb3cgbGltaXRzIHRyaWdnZXJpbmcgZmxhZw0KICAgIGFzc2VydGlvbiBhbmQgZGVhc3NlcnRpb24uIFRoZSBhZGNfaHlzdGVyZXNpcyBwYXJhbWV0ZXIgaXMgYSBQUEUgY29udmVyc2lvbg0KICAgIHJlc3VsdCBvZmZzZXQuDQoNCiAgRXhhbXBsZQ0KICAgIFRoZSBleGFtcGxlIGJlbG93IGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHRoZSBBQ0Vfc2V0X2ZsYWdfaHlzdGVyZXNpcygpDQogICAgZnVuY3Rpb24gdG8gc2V0IGEgMTAwbVYgaHlzdGVyZXNpcyBvbiB0aGUgT1ZFUl8xViBmbGFnIG9mIHRoZSBWb2x0YWdlTW9uaXRvcg0KICAgIGlucHV0IGNoYW5uZWwuIFZvbHRhZ2VNb25pdG9yIGFuZCBPVkVSXzFWIGFyZSBuYW1lcyBzZWxlY3RlZCBpbiB0aGUgQUNFDQogICAgY29uZmlndXJhdG9yIGZvciBvbmUgb2YgdGhlIGFuYWxvZyBpbnB1dHMgYW5kIG9uZSBvZiB0aGUgZmxhZ3MgYXNzb2NpYXRlZA0KICAgIHdpdGggdGhhdCBpbnB1dC4NCiAgICBUaGUgbWV0aG9kIHVzZWQgdG8gY29tcHV0ZSB0aGUgYWRjX2h5c3RlcmVzaXMgdmFsdWUgd2lsbCB3b3JrIGZvciBhbGwNCiAgICBpbnB1dCB0eXBlcyBpbmNsdWRpbmcgQUJQUyBpbnB1dHMgd2hlcmUgemVybyBWb2x0cyBpcyBub3QgZXF1aXZhbGVudCB0byBhDQogICAgUFBFIHNhbXBsZSB2YWx1ZSBvZiB6ZXJvLg0KDQogIEBjb2RlDQogICAgYWNlX2NoYW5uZWxfaGFuZGxlX3QgY2hhbm5lbF9oYW5kbGU7DQogICAgYWNlX2ZsYWdfaGFuZGxlX3QgZmxhZ19oYW5kbGU7DQogICAgdWludDE2X3QgYWRjX2h5c3RlcmVzaXM7DQogICAgdWludDE2X3QgdXBwZXJfbGltaXQ7DQogICAgdWludDE2X3QgbG93ZXJfbGltaXQ7DQoNCiAgICBjaGFubmVsX2hhbmRsZSA9IFZvbHRhZ2VNb25pdG9yOw0KICAgIGZsYWdfaGFuZGxlID0gVm9sdGFnZU1vbml0b3JfT1ZFUl8xVjsNCg0KICAgIHVwcGVyX2xpbWl0ID0gQUNFX2NvbnZlcnRfZnJvbV9tVihjaGFubmVsX2hhbmRsZSwgMTAwKTsNCiAgICBsb3dlcl9saW1pdCA9IEFDRV9jb252ZXJ0X2Zyb21fbVYoY2hhbm5lbF9oYW5kbGUsIDApOw0KDQogICAgaWYgKHVwcGVyX2xpbWl0ID4gbG93ZXJfbGltaXQpDQogICAgew0KICAgICAgICBhZGNfaHlzdGVyZXNpcyA9IHVwcGVyX2xpbWl0IC0gbG93ZXJfbGltaXQ7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIGFkY19oeXN0ZXJlc2lzID0gbG93ZXJfbGltaXQgLSB1cHBlcl9saW1pdDsNCiAgICB9DQoNCiAgICBBQ0Vfc2V0X2ZsYWdfaHlzdGVyZXNpcyhmbGFnX2hhbmRsZSwgYWRjX2h5c3RlcmVzaXMpOw0KICBAZW5kY29kZQ0KICovDQp2b2lkDQpBQ0Vfc2V0X2ZsYWdfaHlzdGVyZXNpcw0KKA0KICAgIGFjZV9mbGFnX2hhbmRsZV90ICAgZmxhZ19oYW5kbGUsDQogICAgdWludDE2X3QgICAgICAgICAgICBhZGNfaHlzdGVyZXNpcw0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV9zZXRfZmxhZ19hc3NlcnRpb24oKSBmdW5jdGlvbiBzZXRzIHRoZSBQUEUgc2FtcGxlIHZhbHVlIHRoYXQgbXVzdCBiZQ0KICByZWFjaGVkIGluIG9yZGVyIGZvciB0aGUgZmxhZyBzcGVjaWZpZWQgYXMgcGFyYW1ldGVyIHRvIGJlY29tZSBhc3NlcnRlZC4gSXQgaXMNCiAgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBBQ0Vfc2V0X2ZsYWdfZGVhc3NlcnRpb24oKSBmdW5jdGlvbiBhcyBhbg0KICBhbHRlcm5hdGl2ZSB0byB0aGUgQUNFX3NldF9mbGFnX3RocmVzaG9sZCgpIGFuZCBBQ0Vfc2V0X2ZsYWdfaHlzdGVyZXNpcygpDQogIGZ1bmN0aW9ucyB0byBzZXQgdGhlIGh5c3RlcmVzaXMgd2luZG93IG9mIGFuIGh5c3RlcmVzaXMgZmxhZy4NCiAgVGhlIEFDRV9zZXRfZmxhZ19hc3NlcnRpb24oKSBhbmQgQUNFX3NldF9mbGFnX2RlYXNzZXJ0aW9uKCkgZnVuY3Rpb25zIGFyZQ0KICBpbnRlbmRlZCB0byBiZSB1c2VkIHdoZXJlIHRoZSB0aHJlc2hvbGQgdmFsdWUgaXMgbm90IGNlbnRlcmVkIHdpdGhpbiB0aGUNCiAgaHlzdGVyZXNpcyB3aW5kb3cuIFRoZXkgYWxsb3cgc3BlY2lmeWluZyB0aGUgYWN0dWFsIHRocmVzaG9sZCB2YWx1ZXMgYXQgd2hpY2gNCiAgdGhlIGZsYWcgd2lsbCBiZSBhc3NlcnRlZCBhbmQgZGVhc3NlcnRlZC4NCg0KICBAcGFyYW0gZmxhZ19oYW5kbGUNCiAgICBUaGUgZmxhZ19oYW5kbGUgcGFyYW1ldGVyIGlkZW50aWZpZXMgb25lIG9mIHRoZSBmbGFncyBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlDQogICAgdmFsdWUgb2YgYW4gYW5hbG9nIGlucHV0IGNoYW5uZWwuIFRoZSBhdmFpbGFibGUgZmxhZyBoYW5kbGUgdmFsdWVzIGNhbiBiZQ0KICAgIGZvdW5kIGluIHRoZSBhY2VfaGFuZGxlcy5oIGZpbGUgbG9jYXRlZCBpbiB0aGUgLlxkcml2ZXJzX2NvbmZpZ1xtc3NfYWNlDQogICAgc3ViZGlyZWN0b3J5LiBUaGUgZmxhZyBoYW5kbGUgdmFsdWUgY2FuIGFsc28gYmUgcmV0cmlldmVkIHRocm91Z2ggYSBjYWxsIHRvDQogICAgQUNFX2dldF9mbGFnX2hhbmRsZSgpIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGZsYWcgaXMga25vd24sIG9yIGJ5IGl0ZXJhdGluZw0KICAgIHRob3VnaCBhbGwgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIGFuIGFuYWxvZyBpbnB1dCBjaGFubmVsIHVzaW5nIHRoZQ0KICAgIEFDRV9nZXRfY2hhbm5lbF9maXJzdF9mbGFnKCkgYW5kIEFDRV9nZXRfY2hhbm5lbF9uZXh0X2ZsYWcoKS4NCg0KICBAcGFyYW0gYXNzZXJ0aW9uX3ZhbHVlDQogICAgVGhlIGFzc2VydGlvbl92YWx1ZSBwYXJhbWV0ZXIgaXMgdGhlIFBvc3QgUHJvY2Vzc2luZyBFbmdpbmUgc2FtcGxlIHZhbHVlIHRoYXQNCiAgICBtdXN0IGJlIHJlYWNoZWQgZm9yIHRoZSBmbGFnLCBpZGVudGlmaWVkIHRocm91Z2ggdGhlIGZsYWdfaGFuZGxlIHBhcmFtZXRlciwNCiAgICB0byBiZWNvbWUgYXNzZXJ0ZWQuIFRoZSBQUEUgc2FtcGxlIHZhbHVlIGlzIGFsd2F5cyBhIDEyIGJpdHMgc2FtcGxlIHZhbHVlDQogICAgcmVnYXJkbGVzcyBvZiB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgQURDIHVzZWQgdG8gc2FtcGxlIHRoZSBpbnB1dCBjaGFubmVsLg0KICovDQp2b2lkIEFDRV9zZXRfZmxhZ19hc3NlcnRpb24NCigNCiAgICBhY2VfZmxhZ19oYW5kbGVfdCAgIGZsYWdfaGFuZGxlLA0KICAgIHVpbnQxNl90ICAgICAgICAgICAgYXNzZXJ0aW9uX3ZhbHVlDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgQUNFX3NldF9mbGFnX2RlYXNzZXJ0aW9uKCkgZnVuY3Rpb24gc2V0cyB0aGUgUFBFIHNhbXBsZSB2YWx1ZSB0aGF0IG11c3QgYmUNCiAgcmVhY2hlZCBpbiBvcmRlciBmb3IgdGhlIGZsYWcgc3BlY2lmaWVkIGFzIHBhcmFtZXRlciB0byBiZWNvbWUgZGVhc3NlcnRlZC4gSXQNCiAgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBBQ0Vfc2V0X2ZsYWdfYXNzZXJ0aW9uKCkgZnVuY3Rpb24gYXMgYW4NCiAgYWx0ZXJuYXRpdmUgdG8gdGhlIEFDRV9zZXRfZmxhZ190aHJlc2hvbGQoKSBhbmQgQUNFX3NldF9mbGFnX2h5c3RlcmVzaXMoKQ0KICBmdW5jdGlvbnMgdG8gc2V0IHRoZSBoeXN0ZXJlc2lzIHdpbmRvdyBvZiBhbiBoeXN0ZXJlc2lzIGZsYWcuDQogIFRoZSBBQ0Vfc2V0X2ZsYWdfYXNzZXJ0aW9uKCkgYW5kIEFDRV9zZXRfZmxhZ19kZWFzc2VydGlvbigpIGZ1bmN0aW9ucyBhcmUNCiAgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aGVyZSB0aGUgdGhyZXNob2xkIHZhbHVlIGlzIG5vdCBjZW50ZXJlZCB3aXRoaW4gdGhlDQogIGh5c3RlcmVzaXMgd2luZG93LiBUaGV5IGFsbG93IHNwZWNpZnlpbmcgdGhlIGFjdHVhbCB0aHJlc2hvbGQgdmFsdWVzIGF0IHdoaWNoDQogIHRoZSBmbGFnIHdpbGwgYmUgYXNzZXJ0ZWQgYW5kIGRlYXNzZXJ0ZWQuDQoNCiAgQHBhcmFtIGZsYWdfaGFuZGxlDQogICAgVGhlIGZsYWdfaGFuZGxlIHBhcmFtZXRlciBpZGVudGlmaWVzIG9uZSBvZiB0aGUgZmxhZ3MgZ2VuZXJhdGVkIGJhc2VkIG9uIHRoZQ0KICAgIHZhbHVlIG9mIGFuIGFuYWxvZyBpbnB1dCBjaGFubmVsLiBUaGUgYXZhaWxhYmxlIGZsYWcgaGFuZGxlIHZhbHVlcyBjYW4gYmUNCiAgICBmb3VuZCBpbiB0aGUgYWNlX2hhbmRsZXMuaCBmaWxlIGxvY2F0ZWQgaW4gdGhlIC5cZHJpdmVyc19jb25maWdcbXNzX2FjZQ0KICAgIHN1YmRpcmVjdG9yeS4gVGhlIGZsYWcgaGFuZGxlIHZhbHVlIGNhbiBhbHNvIGJlIHJldHJpZXZlZCB0aHJvdWdoIGEgY2FsbCB0bw0KICAgIEFDRV9nZXRfZmxhZ19oYW5kbGUoKSB3aGVuIHRoZSBuYW1lIG9mIHRoZSBmbGFnIGlzIGtub3duLCBvciBieSBpdGVyYXRpbmcNCiAgICB0aG91Z2ggYWxsIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCBhbiBhbmFsb2cgaW5wdXQgY2hhbm5lbCB1c2luZyB0aGUNCiAgICBBQ0VfZ2V0X2NoYW5uZWxfZmlyc3RfZmxhZygpIGFuZCBBQ0VfZ2V0X2NoYW5uZWxfbmV4dF9mbGFnKCkuDQoNCiAgQHBhcmFtIGFzc2VydGlvbl92YWx1ZQ0KICAgIFRoZSBhc3NlcnRpb25fdmFsdWUgcGFyYW1ldGVyIGlzIHRoZSBQb3N0IFByb2Nlc3NpbmcgRW5naW5lIHNhbXBsZSB2YWx1ZQ0KICAgIHRoYXQgbXVzdCBiZSByZWFjaGVkIGZvciB0aGUgZmxhZywgaWRlbnRpZmllZCB0aHJvdWdoIHRoZSBmbGFnX2hhbmRsZQ0KICAgIHBhcmFtZXRlciwgdG8gYmVjb21lIGRlLWFzc2VydGVkLiBUaGUgUFBFIHNhbXBsZSB2YWx1ZSBpcyBhbHdheXMgYSAxMiBiaXRzDQogICAgc2FtcGxlIHZhbHVlIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIEFEQyB1c2VkIHRvIHNhbXBsZSB0aGUNCiAgICBpbnB1dCBjaGFubmVsLg0KICovDQp2b2lkIEFDRV9zZXRfZmxhZ19kZWFzc2VydGlvbg0KKA0KICAgIGFjZV9mbGFnX2hhbmRsZV90ICAgZmxhZ19oYW5kbGUsDQogICAgdWludDE2X3QgICAgICAgICAgICBhc3NlcnRpb25fdmFsdWUNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0Vfc2V0X2NoYW5uZWxfaHlzdGVyZXNpcygpIGZ1bmN0aW9uIHNldHMgdGhlIGh5c3RlcmVzaXMgYXBwbGllZCB0bw0KICBhbmFsb2cgaW5wdXQgY2hhbm5lbCBzYW1wbGUgdmFsdWVzIHdoZW4gZ2VuZXJhdGluZyBmbGFncy4gSXQgc2V0cyB0aGUNCiAgaHlzdGVyZXNpcyBmb3IgYWxsIGZsYWdzIGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhlIGFuYWxvZyBpbnB1dA0KICBjaGFubmVsIGlkZW50aWZpZWQgYnkgdGhlIGNoYW5uZWwgaGFuZGxlIHBhc3NlZCBhcyBmaXJzdCBwYXJhbWV0ZXIuDQoNCiAgQHBhcmFtIGNoYW5uZWxfaGFuZGxlDQogICAgVGhlIGNoYW5uZWxfaGFuZGxlIHBhcmFtZXRlciBpZGVudGlmaWVzIG9uZSBvZiB0aGUgYW5hbG9nIGlucHV0IGNoYW5uZWxzDQogICAgbW9uaXRvcmVkIGJ5IHRoZSBBQ0UuIFRoZSBhdmFpbGFibGUgY2hhbm5lbCBoYW5kbGUgdmFsdWVzIGNhbiBiZSBmb3VuZCBpbg0KICAgIHRoZSBhY2VfaGFuZGxlcy5oIGZpbGUgbG9jYXRlZCBpbiB0aGUgLlxkcml2ZXJzX2NvbmZpZ1xtc3NfYWNlIHN1YmRpcmVjdG9yeS4NCiAgICBUaGUgY2hhbm5lbCBoYW5kbGUgdmFsdWUgY2FuIGFsc28gYmUgcmV0cmlldmVkIHRocm91Z2ggYSBjYWxsIHRvDQogICAgQUNFX2dldF9jaGFubmVsX2hhbmRsZSgpIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGNoYW5uZWwgaXMga25vd24sIG9yIGJ5DQogICAgaXRlcmF0aW5nIHRob3VnaCBhbGwgYW5hbG9nIGlucHV0IGNoYW5uZWwgdXNpbmcgdGhlIEFDRV9nZXRfZmlyc3RfY2hhbm5lbCgpDQogICAgYW5kIEFDRV9nZXRfbmV4dF9jaGFubmVsKCkuDQoNCiAgQHBhcmFtIGFkY19oeXN0ZXJlc2lzDQogICAgVGhlIGFkY19oeXN0ZXJlc2lzIHBhcmFtZXRlciBpcyB0aGUgdmFsdWUgdG8gYWRkIGFuZCBzdWJ0cmFjdCB0byB0aGUNCiAgICB0aHJlc2hvbGQgdmFsdWUgdG8gb2J0YWluIHRoZSBoeXN0ZXJlc2lzIGhpZ2ggYW5kIGxvdyBsaW1pdHMgdHJpZ2dlcmluZyBmbGFnDQogICAgYXNzZXJ0aW9uIGFuZCBkZWFzc2VydGlvbi4gVGhlIGFkY19oeXN0ZXJlc2lzIHBhcmFtZXRlciBpcyBhIFBQRSBjb252ZXJzaW9uDQogICAgcmVzdWx0IG9mZnNldC4NCiAqLw0Kdm9pZA0KQUNFX3NldF9jaGFubmVsX2h5c3RlcmVzaXMNCigNCiAgICBhY2VfY2hhbm5lbF9oYW5kbGVfdCAgICBjaGFubmVsX2hhbmRsZSwNCiAgICB1aW50MTZfdCAgICAgICAgICAgICAgICBhZGNfaHlzdGVyZXNpcw0KKTsNCg0KDQovKiogQH0gKi8NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogKg0KICovDQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBGbGFncyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovLyoqDQogIEBkZWZncm91cCBncm91cDYgUG9zdCBQcm9jZXNzaW5nIEVuZ2luZSBGbGFncw0KICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBjb250cm9sIGludGVycnVwdHMgZ2VuZXJhdGVkIGJ5IHRoZSBBQ0Uncw0KICBQb3N0IFByb2Nlc3NpbmcgRW5naW5lIChQUEUpIHdoZW4gbW9uaXRvcmVkIGlucHV0cyByaXNlIGFib3ZlIG9yIGZhbGwgYmVsb3cNCiAgdGhyZXNob2xkcyBzcGVjaWZpZWQgaW4gdGhlIEFDRSBjb25maWd1cmF0b3Igc29mdHdhcmUgdG9vbC4NCiAgQHsNCiAqLy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQoNCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICAgVGhlc2UgY29uc3RhbnQgZGVmaW5pdGlvbnMgYXJlIHRoZSByZXR1cm4gdmFsdWVzIG9mIHRoZSBBQ0VfZ2V0X2ZsYWdfc3RhdHVzKCkNCiAgIGZ1bmN0aW9uLiBUaGV5IHNwZWNpZnkgdGhlIHN0YXR1cyBvZiB0aGUgUG9zdCBQcm9jZXNzaW5nIEVuZ2luZSAoUFBFKSBmbGFnLg0KICAqLw0KI2RlZmluZSBVTktOT1dOX0ZMQUcgICAgICAgIChpbnQzMl90KSgtMSkNCiNkZWZpbmUgRkxBR19BU1NFUlRFRCAgICAgICAoaW50MzJfdCkxDQojZGVmaW5lIEZMQUdfTk9UX0FTU0VSVEVEICAgKGludDMyX3QpMA0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGlzIGNvbnN0YW50IGlzIHJldHVybmVkIGJ5IHRoZSBBQ0VfZ2V0X2ZsYWdfaGFuZGxlIGZ1bmN0aW9uIHdoZW4gdGhlIGRyaXZlcg0KICBjYW6SdCBmaW5kIGEgdmFsaWQgaGFuZGxlIGZvciB0aGUgUG9zdCBQcm9jZXNzaW5nIEVuZ2luZSAoUFBFKSBmbGFnLg0KICovDQojZGVmaW5lIElOVkFMSURfRkxBR19IQU5ETEUgICAgIE5CX09GX0FDRV9GTEFHX0hBTkRMRVMNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV9nZXRfZmxhZ19oYW5kbGUoKSBmdW5jdGlvbiByZXR1cm5zIHRoZSBoYW5kbGUgb2YgdGhlIGZsYWcgaWRlbnRpZmllZA0KICBieSB0aGUgZmxhZyBuYW1lIHBhc3NlZCBhcyBwYXJhbWV0ZXIuIFRoZSBmbGFnIGhhbmRsZSBvYnRhaW5lZCB0aHJvdWdoIHRoaXMNCiAgZnVuY3Rpb24gaXMgdGhlbiB1c2VkIGFzIHBhcmFtZXRlciB0byBvdGhlciBmbGFnIGNvbnRyb2wgZnVuY3Rpb25zIHRvIGlkZW50aWZ5DQogIHdoaWNoIGZsYWcgaXMgdG8gYmUgY29udHJvbGxlZCBieSB0aGUgY2FsbGVkIGZ1bmN0aW9uLg0KDQogIEBwYXJhbSBwX3N6X2Z1bGxfZmxhZ19uYW1lDQogICAgVGhlIHBfc3pfZnVsbF9mbGFnX25hbWUgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhIHplcm8tdGVybWluYXRlZCBzdHJpbmcNCiAgICBob2xkaW5nIHRoZSBuYW1lIG9mIHRoZSBmbGFnIGFzIHNwZWNpZmllZCBpbiB0aGUgQUNFIGNvbmZpZ3VyYXRvci4gVGhlIGZ1bGwNCiAgICBuYW1lIG9mIGEgZmxhZyBjb250YWlucyBib3RoIHRoZSBuYW1lIG9mIHRoZSBtb25pdG9yZWQgaW5wdXQgY2hhbm5lbCBhbmQgdGhlDQogICAgbmFtZSBvZiB0aGUgZmxhZyBnZW5lcmF0ZWQgYmFzZWQgdGhlIGxldmVsIG9mIHRoYXQgaW5wdXQgc2VwYXJhdGVkIGJ5ICI6Ii4NCiAgICBGb3IgZXhhbXBsZSwgdGhlIGZ1bGwgbmFtZSBmb3IgdGhlIGZsYWcgY2FsbGVkICJDcml0aWNhbE92ZXIiIHJhaXNlZCB3aGVuDQogICAgdGhlIGlucHV0IGNoYW5uZWwgY2FsbGVkICJNYWluU3VwcGx5IiByZWFjaGVzIGEgY3JpdGljYWwgbGV2ZWwgd291bGQgYmUNCiAgICBuYW1lZCAiTWFpblN1cHBseTpDcml0aWNhbE92ZXIiLg0KDQogIEByZXR1cm4NCiAgICBUaGUgQUNFX2dldF9mbGFnX2hhbmRsZSgpIHJldHVybnMgdGhlIGZsYWcgaGFuZGxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmxhZw0KICAgIG5hbWUgcGFzc2VkIGFzIHBhcmFtZXRlci4gSXQgcmV0dXJucyBJTlZBTElEX0ZMQUdfSEFORExFIHdoZW4gdGhlIGZsYWcgbmFtZQ0KICAgIGlzIGludmFsaWQgYW5kIG5vdCByZWNvZ25pemVkIGJ5IHRoZSBBQ0UgZHJpdmVyLg0KICovDQphY2VfZmxhZ19oYW5kbGVfdA0KQUNFX2dldF9mbGFnX2hhbmRsZQ0KKA0KICAgIGNvbnN0IHVpbnQ4X3QgKiBwX3N6X2Z1bGxfZmxhZ19uYW1lDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgQUNFX2dldF9mbGFnX3N0YXR1cygpIGZ1bmN0aW9uIHJldHVybnMgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBmbGFnDQogIHNwZWNpZmllZCBhcyBwYXJhbWV0ZXIuIFRoZSBmbGFnIGlzIGlkZW50aWZpZWQgdGhyb3VnaCB0aGUgbmFtZSBzcGVjaWZpZWQgaW4NCiAgdGhlIEFDRSBjb25maWd1cmF0b3Igd2hlbiB0aGUgZmxhZyB3YXMgY3JlYXRlZC4NCg0KICBAcGFyYW0gZmxhZ19oYW5kbGUNCiAgICBUaGUgZmxhZ19oYW5kbGUgcGFyYW1ldGVyIGlkZW50aWZpZXMgb25lIG9mIHRoZSBmbGFncyBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlDQogICAgdmFsdWUgb2YgYW4gYW5hbG9nIGlucHV0IGNoYW5uZWwuIFRoZSBhdmFpbGFibGUgZmxhZyBoYW5kbGUgdmFsdWVzIGNhbiBiZQ0KICAgIGZvdW5kIGluIHRoZSBhY2VfaGFuZGxlcy5oIGZpbGUgbG9jYXRlZCBpbiB0aGUgLlxkcml2ZXJzX2NvbmZpZ1xtc3NfYWNlDQogICAgc3ViZGlyZWN0b3J5LiBUaGUgZmxhZyBoYW5kbGUgdmFsdWUgY2FuIGFsc28gYmUgcmV0cmlldmVkIHRocm91Z2ggYSBjYWxsIHRvDQogICAgQUNFX2dldF9mbGFnX2hhbmRsZSgpIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGZsYWcgaXMga25vd24sIG9yIGJ5IGl0ZXJhdGluZw0KICAgIHRob3VnaCBhbGwgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIGFuIGFuYWxvZyBpbnB1dCBjaGFubmVsIHVzaW5nIHRoZQ0KICAgIEFDRV9nZXRfY2hhbm5lbF9maXJzdF9mbGFnKCkgYW5kIEFDRV9nZXRfY2hhbm5lbF9uZXh0X2ZsYWcoKS4NCg0KICAgQHJldHVybg0KICAgIFRoZSBBQ0VfZ2V0X2ZsYWdfc3RhdHVzKCkgZnVuY3Rpb24gcmV0dXJucyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMNCiAgICBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBmbGFnOg0KICAgICAgICAtIEZMQUdfQVNTRVJURUQgaWYgdGhlIGZsYWcgaXMgcmFpc2VkL2Fzc2VydGVkLg0KICAgICAgICAtIEZMQUdfTk9UX0FTU0VSVEVEIGlmIHRoZSBmbGFnIGlzIG5vdCBhc3NlcnRlZC4NCiAgICAgICAgLSBVTktOT1dOX0ZMQUcgaWYgdGhlIGZsYWcgbmFtZSBpcyBub3QgcmVjb2duaXplZCBieSB0aGUgZHJpdmVyLg0KKi8NCmludDMyX3QNCkFDRV9nZXRfZmxhZ19zdGF0dXMNCigNCiAgICBhY2VfZmxhZ19oYW5kbGVfdCAgIGZsYWdfaGFuZGxlDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgQUNFX2VuYWJsZV9jaGFubmVsX2ZsYWdzX2lycSgpIGZ1bmN0aW9uIGVuYWJsZXMgYWxsIGZsYWdzIGdlbmVyYXRlZCBiYXNlZA0KICBvbiB0aGUgdmFsdWUgb2YgdGhlIGFuYWxvZyBpbnB1dCBjaGFubmVsIHBhc3NlZCBhcyBwYXJhbWV0ZXIgdG8gZ2VuZXJhdGUNCiAgaW50ZXJydXB0cy4gRmxhZ3MgdXNlZCB0byBkZXRlY3QgdGhhdCB0aHJlc2hvbGRzIGFyZSBjcm9zc2VkIGJ5IHRoZSB2YWx1ZQ0KICBzYW1wbGVkIG9uIHRoZSBhbmFsb2cgaW5wdXQgY2hhbm5lbCBpZGVudGlmaWVkIGFzIHBhcmFtZXRlciBhcmUgZW5hYmxlZCB0bw0KICBnZW5lcmF0ZSBpbnRlcnJ1cHRzIGJ5IHRoaXMgZnVuY3Rpb24uIEl0IGVuYWJsZXMgZmxhZyBpbnRlcnJ1cHRzIGJvdGggYXQgdGhlDQogIEFDRSBQRUUgZmxhZyBhbmQgQ29ydGV4LU0zIGludGVycnVwdCBjb250cm9sbGVyIGxldmVscy4NCg0KICBAcGFyYW0gY2hhbm5lbF9oYW5kbGUNCiAgICBUaGUgY2hhbm5lbF9oYW5kbGUgcGFyYW1ldGVyIGlkZW50aWZpZXMgb25lIG9mIHRoZSBhbmFsb2cgaW5wdXQgY2hhbm5lbHMNCiAgICBtb25pdG9yZWQgYnkgdGhlIEFDRS4gVGhlIGF2YWlsYWJsZSBjaGFubmVsIGhhbmRsZSB2YWx1ZXMgY2FuIGJlIGZvdW5kIGluIHRoZQ0KICAgIGFjZV9oYW5kbGVzLmggZmlsZSBsb2NhdGVkIGluIHRoZSAuL2RyaXZlcnNfY29uZmlnL21zc19hY2Ugc3ViZGlyZWN0b3J5LiBUaGUNCiAgICBjaGFubmVsIGhhbmRsZSB2YWx1ZSBjYW4gYWxzbyBiZSByZXRyaWV2ZWQgdGhyb3VnaCBhIGNhbGwgdG8NCiAgICBBQ0VfZ2V0X2NoYW5uZWxfaGFuZGxlKCkgd2hlbiB0aGUgbmFtZSBvZiB0aGUgY2hhbm5lbCBpcyBrbm93biwgb3IgYnkNCiAgICBpdGVyYXRpbmcgdGhvdWdoIGFsbCBhbmFsb2cgaW5wdXQgY2hhbm5lbCB1c2luZyB0aGUgQUNFX2dldF9maXJzdF9jaGFubmVsKCkNCiAgICBhbmQgQUNFX2dldF9uZXh0X2NoYW5uZWwoKS4NCiAqLw0Kdm9pZCBBQ0VfZW5hYmxlX2NoYW5uZWxfZmxhZ3NfaXJxDQooDQogICAgYWNlX2NoYW5uZWxfaGFuZGxlX3QgY2hhbm5lbF9oYW5kbGUNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfZGlzYWJsZV9jaGFubmVsX2ZsYWdzX2lycSgpIGZ1bmN0aW9uIGRpc2FibGVzIGFsbCBmbGFncyBnZW5lcmF0ZWQNCiAgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSBhbmFsb2cgaW5wdXQgY2hhbm5lbCBwYXNzZWQgYXMgcGFyYW1ldGVyIHRvIGdlbmVyYXRlDQogIGludGVycnVwdHMuIEZsYWdzIHVzZWQgdG8gZGV0ZWN0IHRoYXQgdGhyZXNob2xkcyBhcmUgY3Jvc3NlZCBieSB0aGUgdmFsdWUNCiAgc2FtcGxlZCBvbiB0aGUgYW5hbG9nIGlucHV0IGNoYW5uZWwgaWRlbnRpZmllZCBhcyBwYXJhbWV0ZXIgYXJlIGRpc2FibGVkIGZyb20NCiAgZ2VuZXJhdGluZyBpbnRlcnJ1cHRzIGJ5IHRoaXMgZnVuY3Rpb24uIFRoZSBpbnRlcnJ1cHQgaXMgb25seSBkaXNhYmxlZCBhdCB0aGUNCiAgQUNFIFBQRSBmbGFnIGxldmVsIGluIG9yZGVyIHRvIGF2b2lkIGRpc2FibGluZyBvdGhlciBjYWhubmVsJ3MgZmxhZyBpbnRlcnJ1cHRzDQogIHdoaWNoIG1heSBoYXBwZW4gdG8gdXNlIHRoZSBzYW1lIEFDRSB0aHJlc2hvbGQgaW50ZXJydXB0IGxpbmUuDQoNCiAgQHBhcmFtIGNoYW5uZWxfaGFuZGxlDQogICAgVGhlIGNoYW5uZWxfaGFuZGxlIHBhcmFtZXRlciBpZGVudGlmaWVzIG9uZSBvZiB0aGUgYW5hbG9nIGlucHV0IGNoYW5uZWxzDQogICAgbW9uaXRvcmVkIGJ5IHRoZSBBQ0UuIFRoZSBhdmFpbGFibGUgY2hhbm5lbCBoYW5kbGUgdmFsdWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUNCiAgICBhY2VfaGFuZGxlcy5oIGZpbGUgbG9jYXRlZCBpbiB0aGUgLi9kcml2ZXJzX2NvbmZpZy9tc3NfYWNlIHN1YmRpcmVjdG9yeS4gVGhlDQogICAgY2hhbm5lbCBoYW5kbGUgdmFsdWUgY2FuIGFsc28gYmUgcmV0cmlldmVkIHRocm91Z2ggYSBjYWxsIHRvDQogICAgQUNFX2dldF9jaGFubmVsX2hhbmRsZSgpIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGNoYW5uZWwgaXMga25vd24sIG9yIGJ5DQogICAgaXRlcmF0aW5nIHRob3VnaCBhbGwgYW5hbG9nIGlucHV0IGNoYW5uZWwgdXNpbmcgdGhlIEFDRV9nZXRfZmlyc3RfY2hhbm5lbCgpDQogICAgYW5kIEFDRV9nZXRfbmV4dF9jaGFubmVsKCkuDQogKi8NCnZvaWQgQUNFX2Rpc2FibGVfY2hhbm5lbF9mbGFnc19pcnENCigNCiAgICBhY2VfY2hhbm5lbF9oYW5kbGVfdCBjaGFubmVsX2hhbmRsZQ0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV9jbGVhcl9jaGFubmVsX2ZsYWdzX2lycSgpIGZ1bmN0aW9uIGNsZWFycyBhbGwgaW50ZXJydXB0cyBnZW5lcmF0ZWQgYnkNCiAgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbmFsb2cgaW5wdXQgY2hhbm5lbCBwYXNzZWQgYXMgcGFyYW1ldGVyLiBJbnRlcnJ1cHQNCiAgZ2VuZXJhdGVkIGJ5IGZsYWdzIHVzZWQgdG8gZGV0ZWN0IHRoYXQgdGhyZXNob2xkcyBhcmUgY3Jvc3NlZCBieSB0aGUgdmFsdWUNCiAgc2FtcGxlZCBvbiB0aGUgYW5hbG9nIGlucHV0IGNoYW5uZWwgaWRlbnRpZmllZCBhcyBwYXJhbWV0ZXIgYXJlIGNsZWFyZWQgYnkNCiAgdGhpcyBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiB3b3VsZCB0eXBpY2FsbHkgYmUgdXNlZCBiZWZvcmUgZW5hYmxpbmcgdGhlIGZsYWcNCiAgaW50ZXJydXB0cyBpbiBvcmRlciB0byBpZ25vcmUgcGFzdCBldmVudHMuDQoNCiAgQHBhcmFtIGNoYW5uZWxfaGFuZGxlDQogICAgVGhlIGNoYW5uZWxfaGFuZGxlIHBhcmFtZXRlciBpZGVudGlmaWVzIG9uZSBvZiB0aGUgYW5hbG9nIGlucHV0IGNoYW5uZWxzDQogICAgbW9uaXRvcmVkIGJ5IHRoZSBBQ0UuIFRoZSBhdmFpbGFibGUgY2hhbm5lbCBoYW5kbGUgdmFsdWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUNCiAgICBhY2VfaGFuZGxlcy5oIGZpbGUgbG9jYXRlZCBpbiB0aGUgLi9kcml2ZXJzX2NvbmZpZy9tc3NfYWNlIHN1YmRpcmVjdG9yeS4gVGhlDQogICAgY2hhbm5lbCBoYW5kbGUgdmFsdWUgY2FuIGFsc28gYmUgcmV0cmlldmVkIHRocm91Z2ggYSBjYWxsIHRvDQogICAgQUNFX2dldF9jaGFubmVsX2hhbmRsZSgpIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGNoYW5uZWwgaXMga25vd24sIG9yIGJ5DQogICAgaXRlcmF0aW5nIHRob3VnaCBhbGwgYW5hbG9nIGlucHV0IGNoYW5uZWwgdXNpbmcgdGhlIEFDRV9nZXRfZmlyc3RfY2hhbm5lbCgpDQogICAgYW5kIEFDRV9nZXRfbmV4dF9jaGFubmVsKCkuDQogKi8NCnZvaWQgQUNFX2NsZWFyX2NoYW5uZWxfZmxhZ3NfaXJxDQooDQogICAgYWNlX2NoYW5uZWxfaGFuZGxlX3QgY2hhbm5lbF9oYW5kbGUNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfZW5hYmxlX2ZsYWdfaXJxKCkgZnVuY3Rpb24gZW5hYmxlcyB0aGUgQUNFIHBvc3QgcHJvY2Vzc2luZyBlbmdpbmUgKFBQRSkNCiAgZ2VuZXJhdGVkIGZsYWdzIHNwZWNpZmllZCBhcyBwYXJhbWV0ZXIgdG8gaW50ZXJydXB0IHRoZSBDb3J0ZXgtTTMgcHJvY2Vzc29yLg0KICBJdCBlbmFibGVzIGZsYWcgaW50ZXJydXB0cyBib3RoIGF0IHRoZSBBQ0UgUFBFIGZsYWcgYW5kIENvcnRleC1NMyBpbnRlcnJ1cHQNCiAgY29udHJvbGxlciBsZXZlbHMuDQoNCiAgQHBhcmFtIGZsYWdfaGFuZGxlDQogICAgVGhlIGZsYWdfaGFuZGxlIHBhcmFtZXRlciBpZGVudGlmaWVzIG9uZSBvZiB0aGUgZmxhZ3MgZ2VuZXJhdGVkIGJhc2VkIG9uIHRoZQ0KICAgIHZhbHVlIG9mIGFuIGFuYWxvZyBpbnB1dCBjaGFubmVsLiBUaGUgYXZhaWxhYmxlIGZsYWcgaGFuZGxlIHZhbHVlcyBjYW4gYmUNCiAgICBmb3VuZCBpbiB0aGUgYWNlX2hhbmRsZXMuaCBmaWxlIGxvY2F0ZWQgaW4gdGhlIC5cZHJpdmVyc19jb25maWdcbXNzX2FjZQ0KICAgIHN1YmRpcmVjdG9yeS4gVGhlIGZsYWcgaGFuZGxlIHZhbHVlIGNhbiBhbHNvIGJlIHJldHJpZXZlZCB0aHJvdWdoIGEgY2FsbCB0bw0KICAgIEFDRV9nZXRfZmxhZ19oYW5kbGUoKSB3aGVuIHRoZSBuYW1lIG9mIHRoZSBmbGFnIGlzIGtub3duLCBvciBieSBpdGVyYXRpbmcNCiAgICB0aG91Z2ggYWxsIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCBhbiBhbmFsb2cgaW5wdXQgY2hhbm5lbCB1c2luZyB0aGUNCiAgICBBQ0VfZ2V0X2NoYW5uZWxfZmlyc3RfZmxhZygpIGFuZCBBQ0VfZ2V0X2NoYW5uZWxfbmV4dF9mbGFnKCkuDQogKi8NCnZvaWQgQUNFX2VuYWJsZV9mbGFnX2lycQ0KKA0KICAgIGFjZV9mbGFnX2hhbmRsZV90IGZsYWdfaGFuZGxlDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgQUNFX2Rpc2FibGVfZmxhZ19pcnEoKSBmdW5jdGlvbiBkaXNhYmxlcyBBQ0UgcG9zdCBwcm9jZXNzaW5nIGVuZ2luZSAoUFBFKQ0KICBnZW5lcmF0ZWQgZmxhZ3MgZnJvbSBpbnRlcnJ1cHRpbmcgdGhlIENvcnRleC1NMy4gVGhlIGludGVycnVwdCBpcyBvbmx5DQogIGRpc2FibGVkIGF0IHRoZSBBQ0UgUFBFIGZsYWcgbGV2ZWwgaW4gb3JkZXIgdG8gYXZvaWQgZGlzYWJsaW5nIG90aGVyIGZsYWdzDQogIGludGVycnVwdHMgd2hpY2ggbWF5IGhhcHBlbiB0byB1c2UgdGhlIHNhbWUgQUNFIHRocmVzaG9sZCBpbnRlcnJ1cHQgbGluZS4NCg0KICBAcGFyYW0gZmxhZ19oYW5kbGUNCiAgICBUaGUgZmxhZ19oYW5kbGUgcGFyYW1ldGVyIGlkZW50aWZpZXMgb25lIG9mIHRoZSBmbGFncyBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlDQogICAgdmFsdWUgb2YgYW4gYW5hbG9nIGlucHV0IGNoYW5uZWwuIFRoZSBhdmFpbGFibGUgZmxhZyBoYW5kbGUgdmFsdWVzIGNhbiBiZQ0KICAgIGZvdW5kIGluIHRoZSBhY2VfaGFuZGxlcy5oIGZpbGUgbG9jYXRlZCBpbiB0aGUgLlxkcml2ZXJzX2NvbmZpZ1xtc3NfYWNlDQogICAgc3ViZGlyZWN0b3J5LiBUaGUgZmxhZyBoYW5kbGUgdmFsdWUgY2FuIGFsc28gYmUgcmV0cmlldmVkIHRocm91Z2ggYSBjYWxsIHRvDQogICAgQUNFX2dldF9mbGFnX2hhbmRsZSgpIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGZsYWcgaXMga25vd24sIG9yIGJ5IGl0ZXJhdGluZw0KICAgIHRob3VnaCBhbGwgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIGFuIGFuYWxvZyBpbnB1dCBjaGFubmVsIHVzaW5nIHRoZQ0KICAgIEFDRV9nZXRfY2hhbm5lbF9maXJzdF9mbGFnKCkgYW5kIEFDRV9nZXRfY2hhbm5lbF9uZXh0X2ZsYWcoKS4NCiAqLw0Kdm9pZCBBQ0VfZGlzYWJsZV9mbGFnX2lycQ0KKA0KICAgIGFjZV9mbGFnX2hhbmRsZV90IGZsYWdfaGFuZGxlDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgQUNFX2NsZWFyX2ZsYWdfaXJxKCkgZnVuY3Rpb24gY2xlYXJzIHRoZSBpbnRlcnJ1cHQgZm9yIHRoZSBmbGFnIHNwZWNpZmllZA0KICBhcyBwYXJhbWV0ZXIuIFRoaXMgZnVuY3Rpb24gd291bGQgdHlwaWNhbGx5IGJlIHVzZWQgYmVmb3JlIGVuYWJsaW5nIHRoZSBmbGFnDQogIGludGVycnVwdCBpbiBvcmRlciB0byBpZ25vcmUgcGFzdCBldmVudHMuDQoNCiAgQHBhcmFtIGZsYWdfaGFuZGxlDQogICAgVGhlIGZsYWdfaGFuZGxlIHBhcmFtZXRlciBpZGVudGlmaWVzIG9uZSBvZiB0aGUgZmxhZ3MgZ2VuZXJhdGVkIGJhc2VkIG9uIHRoZQ0KICAgIHZhbHVlIG9mIGFuIGFuYWxvZyBpbnB1dCBjaGFubmVsLiBUaGUgYXZhaWxhYmxlIGZsYWcgaGFuZGxlIHZhbHVlcyBjYW4gYmUNCiAgICBmb3VuZCBpbiB0aGUgYWNlX2hhbmRsZXMuaCBmaWxlIGxvY2F0ZWQgaW4gdGhlIC5cZHJpdmVyc19jb25maWdcbXNzX2FjZQ0KICAgIHN1YmRpcmVjdG9yeS4gVGhlIGZsYWcgaGFuZGxlIHZhbHVlIGNhbiBhbHNvIGJlIHJldHJpZXZlZCB0aHJvdWdoIGEgY2FsbCB0bw0KICAgIEFDRV9nZXRfZmxhZ19oYW5kbGUoKSB3aGVuIHRoZSBuYW1lIG9mIHRoZSBmbGFnIGlzIGtub3duLCBvciBieSBpdGVyYXRpbmcNCiAgICB0aG91Z2ggYWxsIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCBhbiBhbmFsb2cgaW5wdXQgY2hhbm5lbCB1c2luZyB0aGUNCiAgICBBQ0VfZ2V0X2NoYW5uZWxfZmlyc3RfZmxhZygpIGFuZCBBQ0VfZ2V0X2NoYW5uZWxfbmV4dF9mbGFnKCkuDQogKi8NCnZvaWQgQUNFX2NsZWFyX2ZsYWdfaXJxDQooDQogICAgYWNlX2ZsYWdfaGFuZGxlX3QgZmxhZ19oYW5kbGUNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfZ2V0X2ZsYWdfbmFtZSgpIGZ1bmN0aW9uIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZsYWcgaWRlbnRpZmllZCBieQ0KICB0aGUgZmxhZyBoYW5kbGUgcGFzc2VkIGFzIHBhcmFtZXRlci4NCg0KICBAcGFyYW0gZmxhZ19oYW5kbGUNCiAgICBUaGUgZmxhZ19oYW5kbGUgcGFyYW1ldGVyIGlkZW50aWZpZXMgb25lIG9mIHRoZSBmbGFncyBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlDQogICAgdmFsdWUgb2YgYW4gYW5hbG9nIGlucHV0IGNoYW5uZWwuIFRoZSBhdmFpbGFibGUgZmxhZyBoYW5kbGUgdmFsdWVzIGNhbiBiZQ0KICAgIGZvdW5kIGluIHRoZSBhY2VfaGFuZGxlcy5oIGZpbGUgbG9jYXRlZCBpbiB0aGUgLlxkcml2ZXJzX2NvbmZpZ1xtc3NfYWNlDQogICAgc3ViZGlyZWN0b3J5LiBUaGUgZmxhZyBoYW5kbGUgdmFsdWUgY2FuIGFsc28gYmUgcmV0cmlldmVkIHRocm91Z2ggYSBjYWxsIHRvDQogICAgQUNFX2dldF9mbGFnX2hhbmRsZSgpIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGZsYWcgaXMga25vd24sIG9yIGJ5IGl0ZXJhdGluZw0KICAgIHRob3VnaCBhbGwgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIGFuIGFuYWxvZyBpbnB1dCBjaGFubmVsIHVzaW5nIHRoZQ0KICAgIEFDRV9nZXRfY2hhbm5lbF9maXJzdF9mbGFnKCkgYW5kIEFDRV9nZXRfY2hhbm5lbF9uZXh0X2ZsYWcoKS4NCg0KICBAcmV0dXJuDQogICAgVGhlIEFDRV9nZXRfZmxhZ19uYW1lKCkgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gYSB6ZXJvLXRlcm1pbmF0ZWQNCiAgICBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgZmxhZyBpZGVudGlmaWVkIGJ5IHRoZSBmbGFnIGhhbmRsZSBwYXNzZWQNCiAgICBhcyBwYXJhbWV0ZXIuIEl0IHJldHVybnMgMCBpZiB0aGUgZmxhZyBoYW5kbGUgcGFzc2VkIGFzIHBhcmFtZXRlciBpcyBpbnZhbGlkLg0KICovDQpjb25zdCB1aW50OF90ICoNCkFDRV9nZXRfZmxhZ19uYW1lDQooDQogICAgYWNlX2ZsYWdfaGFuZGxlX3QgZmxhZ19oYW5kbGUNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfZ2V0X2ZsYWdfY2hhbm5lbCgpIGZ1bmN0aW9uIHJldHVybnMgdGhlIGhhbmRsZSBvZiB0aGUgY2hhbm5lbA0KICBtb25pdG9yZWQgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGZsYWcgaWRlbnRpZmllZCBieSB0aGUgZmxhZyBoYW5kbGUgcGFzc2VkDQogIGFzIHBhcmFtZXRlci4NCg0KICBAcGFyYW0gZmxhZ19oYW5kbGUNCiAgICBUaGUgZmxhZ19oYW5kbGUgcGFyYW1ldGVyIGlkZW50aWZpZXMgb25lIG9mIHRoZSBmbGFncyBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlDQogICAgdmFsdWUgb2YgYW4gYW5hbG9nIGlucHV0IGNoYW5uZWwuIFRoZSBhdmFpbGFibGUgZmxhZyBoYW5kbGUgdmFsdWVzIGNhbiBiZQ0KICAgIGZvdW5kIGluIHRoZSBhY2VfaGFuZGxlcy5oIGZpbGUgbG9jYXRlZCBpbiB0aGUgLlxkcml2ZXJzX2NvbmZpZ1xtc3NfYWNlDQogICAgc3ViZGlyZWN0b3J5LiBUaGUgZmxhZyBoYW5kbGUgdmFsdWUgY2FuIGFsc28gYmUgcmV0cmlldmVkIHRocm91Z2ggYSBjYWxsIHRvDQogICAgQUNFX2dldF9mbGFnX2hhbmRsZSgpIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGZsYWcgaXMga25vd24sIG9yIGJ5IGl0ZXJhdGluZw0KICAgIHRob3VnaCBhbGwgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIGFuIGFuYWxvZyBpbnB1dCBjaGFubmVsIHVzaW5nIHRoZQ0KICAgIEFDRV9nZXRfY2hhbm5lbF9maXJzdF9mbGFnKCkgYW5kIEFDRV9nZXRfY2hhbm5lbF9uZXh0X2ZsYWcoKS4NCg0KICBAcmV0dXJuDQogICAgVGhlIEFDRV9nZXRfZmxhZ19jaGFubmVsKCkgZnVuY3Rpb24gcmV0dXJucyBhIGNoYW5uZWwgaGFuZGxlIGlkZW50aWZ5aW5nIHRoZQ0KICAgIGFuYWxvZyBpbnB1dCBjaGFubmVsIG1vbml0b3JlZCBieSB0aGUgZmxhZyBwYXNzZWQgYXMgcGFyYW1ldGVyLg0KICovDQphY2VfY2hhbm5lbF9oYW5kbGVfdA0KQUNFX2dldF9mbGFnX2NoYW5uZWwNCigNCiAgICBhY2VfZmxhZ19oYW5kbGVfdCBmbGFnX2hhbmRsZQ0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV9nZXRfY2hhbm5lbF9mbGFnX2NvdW50KCkgZnVuY3Rpb24gcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGZsYWdzDQogIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5wdXQgY2hhbm5lbCBzcGVjaWZpZWQgYnkgdGhlIGNoYW5uZWxfaGFuZGxlIHBhcmFtZXRlci4NCiAgSXQgaW5kaWNhdGVzIGhvdyBtYW55IGZsYWdzIGFyZSBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQNCiAgYW5hbG9nIGlucHV0IGNoYW5uZWwuDQoNCiAgQHBhcmFtIGNoYW5uZWxfaGFuZGxlDQogICAgVGhlIGNoYW5uZWxfaGFuZGxlIHBhcmFtZXRlciBpZGVudGlmaWVzIG9uZSBvZiB0aGUgYW5hbG9nIGlucHV0IGNoYW5uZWxzDQogICAgbW9uaXRvcmVkIGJ5IHRoZSBBQ0UuIFRoZSBhdmFpbGFibGUgY2hhbm5lbCBoYW5kbGUgdmFsdWVzIGNhbiBiZSBmb3VuZCBpbg0KICAgIHRoZSBhY2VfaGFuZGxlcy5oIGZpbGUgbG9jYXRlZCBpbiB0aGUgLlxkcml2ZXJzX2NvbmZpZ1xtc3NfYWNlIHN1YmRpcmVjdG9yeS4NCiAgICBUaGUgY2hhbm5lbCBoYW5kbGUgdmFsdWUgY2FuIGFsc28gYmUgcmV0cmlldmVkIHRocm91Z2ggYSBjYWxsIHRvDQogICAgQUNFX2dldF9jaGFubmVsX2hhbmRsZSgpIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGNoYW5uZWwgaXMga25vd24sIG9yIGJ5DQogICAgaXRlcmF0aW5nIHRob3VnaCBhbGwgYW5hbG9nIGlucHV0IGNoYW5uZWwgdXNpbmcgdGhlIEFDRV9nZXRfZmlyc3RfY2hhbm5lbCgpDQogICAgYW5kIEFDRV9nZXRfbmV4dF9jaGFubmVsKCkuDQoNCiAgQHJldHVybg0KICAgIFRoZSBBQ0VfZ2V0X2NoYW5uZWxfZmxhZ19jb3VudCgpIGZ1bmN0aW9uIHJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBmbGFncw0KICAgIHRoYXQgYXJlIGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBhbmFsb2cgaW5wdXQgY2hhbm5lbC4NCiAgICBUaGUgQUNFX2dldF9jaGFubmVsX2ZsYWdfY291bnQoKSBmdW5jdGlvbiByZXR1cm5zIDAgaWYgbm8gaW5wdXQgY2hhbm5lbHMgd2VyZQ0KICAgIGNvbmZpZ3VyZWQuDQoNCiAgRXhhbXBsZQ0KICBAY29kZQ0KICAgIHVpbnQzMl90IGluYzsNCiAgICB1aW50MzJfdCBuYl9vZl9mbGFnczsNCiAgICB1aW50MTZfdCBmbGFnX2l0ZXJhdG9yOw0KICAgIGFjZV9mbGFnX2hhbmRsZV90IGN1cnJlbnRfZmxhZzsNCiAgICBhY2VfY2hhbm5lbF9oYW5kbGVfdCBjaGFubmVsX2hhbmRsZTsNCg0KICAgIG5iX29mX2ZsYWdzID0gQUNFX2dldF9jaGFubmVsX2ZsYWdfY291bnQoY2hhbm5lbF9oYW5kbGUpOw0KICAgIGN1cnJlbnRfZmxhZyA9IEFDRV9nZXRfY2hhbm5lbF9maXJzdF9mbGFnKGNoYW5uZWxfaGFuZGxlLCAmZmxhZ19pdGVyYXRvcik7DQoNCiAgICBmb3IgKGluYyA9IDA7IGluYyA8IG5iX29mX2ZsYWdzOyArK2luYykNCiAgICB7DQogICAgICAgIGN1cnJlbnRfZmxhZyA9IEFDRV9nZXRfY2hhbm5lbF9uZXh0X2ZsYWcoY2hhbm5lbF9oYW5kbGUsICZmbGFnX2l0ZXJhdG9yKTsNCiAgICAgICAgZGlzcGxheV9mbGFnX3Byb3BlcnRpZXMoY3VycmVudF9mbGFnKTsNCiAgICB9DQogIEBlbmRjb2RlDQogICovDQp1aW50MzJfdA0KQUNFX2dldF9jaGFubmVsX2ZsYWdfY291bnQNCigNCiAgICBhY2VfY2hhbm5lbF9oYW5kbGVfdCAgICBjaGFubmVsX2hhbmRsZQ0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV9nZXRfY2hhbm5lbF9maXJzdF9mbGFnKCkgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBoYW5kbGUgb2YgdGhlIGZpcnN0DQogIGZsYWcgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbmFsb2cgaW5wdXQgY2hhbm5lbCBpZGVudGlmaWVkIGJ5IHRoZSBjaGFubmVsIGhhbmRsZQ0KICBwYXNzZWQgYXMgcGFyYW1ldGVyLiBJdCBhbHNvIGluaXRpYWxpc2VzIHRoZSB2YWx1ZSBvZiB0aGUgaXRlcmF0b3IgdmFyaWFibGUNCiAgcG9pbnRlZCB0byBieSB0aGUgc2Vjb25kIGZ1bmN0aW9uIHBhcmFtZXRlci4gVGhlIGl0ZXJhdG9yIGNhbiBiZSB1c2VkDQogIHN1YnNlcXVlbnRseSBhcyBhIHBhcmFtZXRlciB0byB0aGUgQUNFX2dldF9jaGFubmVsX25leHRfZmxhZygpIGZ1bmN0aW9uIHRvDQogIGl0ZXJhdGUgdGhyb3VnaCBhbGwgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbmFsb2cgaW5wdXQgY2hhbm5lbC4NCg0KICBAcGFyYW0gY2hhbm5lbF9oYW5kbGUNCiAgICBUaGUgY2hhbm5lbF9oYW5kbGUgcGFyYW1ldGVyIGlkZW50aWZpZXMgb25lIG9mIHRoZSBhbmFsb2cgaW5wdXQgY2hhbm5lbHMNCiAgICBtb25pdG9yZWQgYnkgdGhlIEFDRS4gVGhlIGF2YWlsYWJsZSBjaGFubmVsIGhhbmRsZSB2YWx1ZXMgY2FuIGJlIGZvdW5kIGluIHRoZQ0KICAgIGFjZV9oYW5kbGVzLmggZmlsZSBsb2NhdGVkIGluIHRoZSAuL2RyaXZlcnNfY29uZmlnL21zc19hY2Ugc3ViZGlyZWN0b3J5Lg0KICAgIFRoZSBjaGFubmVsIGhhbmRsZSB2YWx1ZSBjYW4gYWxzbyBiZSByZXRyaWV2ZWQgdGhyb3VnaCBhIGNhbGwgdG8NCiAgICBBQ0VfZ2V0X2NoYW5uZWxfaGFuZGxlKCkgd2hlbiB0aGUgbmFtZSBvZiB0aGUgY2hhbm5lbCBpcyBrbm93biwgb3IgYnkNCiAgICBpdGVyYXRpbmcgdGhvdWdoIGFsbCBhbmFsb2cgaW5wdXQgY2hhbm5lbCB1c2luZyB0aGUgQUNFX2dldF9maXJzdF9jaGFubmVsKCkNCiAgICBhbmQgQUNFX2dldF9uZXh0X2NoYW5uZWwoKS4NCg0KICBAcGFyYW0gaXRlcmF0b3INCiAgICBUaGUgaXRlcmF0b3IgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhIHVpbnQxNl90IGl0ZXJhdG9yIHZhcmlhYmxlLiBUaGUNCiAgICB2YWx1ZSBvZiB0aGUgaXRlcmF0b3IgdmFyaWFibGUgd2lsbCBiZSBzZXQgYnkgdGhlIEFDRV9nZXRfY2hhbm5lbF9maXJzdF9mbGFnKCkNCiAgICBmdW5jdGlvbnMgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBpbiBzdWJzZXF1ZW50IGNhbGxzIHRvDQogICAgQUNFX2dldF9jaGFubmVsX25leHRfZmxhZygpIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlDQogICAgbGlzdCBvZiBmbGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIGFuYWxvZyBpbnB1dCBjaGFubmVsLg0KDQogIEByZXR1cm4NCiAgICBUaGUgQUNFX2dldF9jaGFubmVsX2ZpcnN0X2ZsYWcoKSBmdW5jdGlvbiByZXR1cm5zIGEgZmxhZyBoYW5kbGUgaWRlbnRpZnlpbmcNCiAgICBvbmUgb2YgdGhlIGZsYWdzIGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhlIGFuYWxvZyBpbnB1dCBjaGFubmVsDQogICAgaWRlbnRpZmllZCBieSB0aGUgY2hhbm5lbF9oYW5kbGUgcGFyYW1ldGVyLiBJdCByZXR1cm5zIElOVkFMSURfRkxBR19IQU5ETEUNCiAgICBpZiBubyBmbGFncyBhcmUgZ2VuZXJhdGVkIGJhc2VkIG9uIHRoZSBhbmFsb2cgaW5wdXQgY2hhbm5lbCBpbnB1dCBvciBpZiB0aGUNCiAgICBjaGFubmVsIGhhbmRsZSBpcyBpbnZhbGlkLg0KDQogIEV4YW1wbGUNCiAgQGNvZGUNCiAgICB1aW50MzJfdCBpbmM7DQogICAgdWludDMyX3QgbmJfb2ZfZmxhZ3M7DQogICAgdWludDE2X3QgZmxhZ19pdGVyYXRvcjsNCiAgICBhY2VfZmxhZ19oYW5kbGVfdCBjdXJyZW50X2ZsYWc7DQogICAgYWNlX2NoYW5uZWxfaGFuZGxlX3QgY2hhbm5lbF9oYW5kbGU7DQoNCiAgICBuYl9vZl9mbGFncyA9IEFDRV9nZXRfY2hhbm5lbF9mbGFnX2NvdW50KGNoYW5uZWxfaGFuZGxlKTsNCiAgICBjdXJyZW50X2ZsYWcgPSBBQ0VfZ2V0X2NoYW5uZWxfZmlyc3RfZmxhZyhjaGFubmVsX2hhbmRsZSwgJmZsYWdfaXRlcmF0b3IpOw0KDQogICAgZm9yIChpbmMgPSAwOyBpbmMgPCBuYl9vZl9mbGFnczsgKytpbmMpDQogICAgew0KICAgICAgICBjdXJyZW50X2ZsYWcgPSBBQ0VfZ2V0X2NoYW5uZWxfbmV4dF9mbGFnKGNoYW5uZWxfaGFuZGxlLCAmZmxhZ19pdGVyYXRvcik7DQogICAgICAgIGRpc3BsYXlfZmxhZ19wcm9wZXJ0aWVzKGN1cnJlbnRfZmxhZyk7DQogICAgfQ0KICBAZW5kY29kZQ0KICAqLw0KYWNlX2ZsYWdfaGFuZGxlX3QNCkFDRV9nZXRfY2hhbm5lbF9maXJzdF9mbGFnDQooDQogICAgYWNlX2NoYW5uZWxfaGFuZGxlX3QgICAgY2hhbm5lbF9oYW5kbGUsDQogICAgdWludDE2X3QgKiAgICAgICAgICAgICAgaXRlcmF0b3INCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfZ2V0X2NoYW5uZWxfbmV4dF9mbGFnKCkgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBoYW5kbGUgb2YgYSBmbGFnDQogIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW5hbG9nIGlucHV0IGNoYW5uZWwgaWRlbnRpZmllZCBieSB0aGUgY2hhbm5lbCBoYW5kbGUNCiAgcGFzc2VkIGFzIHBhcmFtZXRlci4gVGhlIHJldHJpZXZlZCBmbGFnIGhhbmRsZSBpcyB0aGUgbmV4dCBvbmUgaW4gdGhlIGRyaXZlcidzDQogIGludGVybmFsIGZsYWcgbGlzdCBiYXNlZCBvbiB0aGUgaXRlcmF0b3IgcGFyYW1ldGVyLg0KDQogIEBwYXJhbSBjaGFubmVsX2hhbmRsZQ0KICAgIFRoZSBjaGFubmVsX2hhbmRsZSBwYXJhbWV0ZXIgaWRlbnRpZmllcyBvbmUgb2YgdGhlIGFuYWxvZyBpbnB1dCBjaGFubmVscw0KICAgIG1vbml0b3JlZCBieSB0aGUgQUNFLiBUaGUgYXZhaWxhYmxlIGNoYW5uZWwgaGFuZGxlIHZhbHVlcyBjYW4gYmUgZm91bmQgaW4gdGhlDQogICAgYWNlX2hhbmRsZXMuaCBmaWxlIGxvY2F0ZWQgaW4gdGhlIC5cZHJpdmVyc19jb25maWdcbXNzX2FjZSBzdWJkaXJlY3RvcnkuDQogICAgVGhlIGNoYW5uZWwgaGFuZGxlIHZhbHVlIGNhbiBhbHNvIGJlIHJldHJpZXZlZCB0aHJvdWdoIGEgY2FsbCB0bw0KICAgIEFDRV9nZXRfY2hhbm5lbF9oYW5kbGUoKSB3aGVuIHRoZSBuYW1lIG9mIHRoZSBjaGFubmVsIGlzIGtub3duLCBvciBieQ0KICAgIGl0ZXJhdGluZyB0aG91Z2ggYWxsIGFuYWxvZyBpbnB1dCBjaGFubmVsIHVzaW5nIHRoZSBBQ0VfZ2V0X2ZpcnN0X2NoYW5uZWwoKQ0KICAgIGFuZCBBQ0VfZ2V0X25leHRfY2hhbm5lbCgpLg0KDQogIEBwYXJhbSBpdGVyYXRvcg0KICAgIFRoZSBpdGVyYXRvciBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGEgdWludDE2X3QgaXRlcmF0b3IgdmFyaWFibGUuIFRoZSB2YWx1ZQ0KICAgIG9mIHRoZSBpdGVyYXRvciB2YXJpYWJsZSB3aWxsIGJlIHNldCBieSB0aGUgQUNFX2dldF9jaGFubmVsX2ZpcnN0X2ZsYWcoKQ0KICAgIGZ1bmN0aW9ucyBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGluIHN1YnNlcXVlbnQgY2FsbHMgdG8NCiAgICBBQ0VfZ2V0X2NoYW5uZWxfbmV4dF9mbGFnKCkgdG8ga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgbGlzdA0KICAgIG9mIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW5hbG9nIGlucHV0IGNoYW5uZWwuDQoNCiAgRXhhbXBsZQ0KICBAY29kZQ0KICAgIHVpbnQzMl90IGluYzsNCiAgICB1aW50MzJfdCBuYl9vZl9mbGFnczsNCiAgICB1aW50MTZfdCBmbGFnX2l0ZXJhdG9yOw0KICAgIGFjZV9mbGFnX2hhbmRsZV90IGN1cnJlbnRfZmxhZzsNCiAgICBhY2VfY2hhbm5lbF9oYW5kbGVfdCBjaGFubmVsX2hhbmRsZTsNCg0KICAgIG5iX29mX2ZsYWdzID0gQUNFX2dldF9jaGFubmVsX2ZsYWdfY291bnQoY2hhbm5lbF9oYW5kbGUpOw0KICAgIGN1cnJlbnRfZmxhZyA9IEFDRV9nZXRfY2hhbm5lbF9maXJzdF9mbGFnKGNoYW5uZWxfaGFuZGxlLCAmZmxhZ19pdGVyYXRvcik7DQoNCiAgICBmb3IgKGluYyA9IDA7IGluYyA8IG5iX29mX2ZsYWdzOyArK2luYykNCiAgICB7DQogICAgICAgIGN1cnJlbnRfZmxhZyA9IEFDRV9nZXRfY2hhbm5lbF9uZXh0X2ZsYWcoY2hhbm5lbF9oYW5kbGUsICZmbGFnX2l0ZXJhdG9yKTsNCiAgICAgICAgZGlzcGxheV9mbGFnX3Byb3BlcnRpZXMoY3VycmVudF9mbGFnKTsNCiAgICB9DQogIEBlbmRjb2RlDQogKi8NCmFjZV9mbGFnX2hhbmRsZV90DQpBQ0VfZ2V0X2NoYW5uZWxfbmV4dF9mbGFnDQooDQogICAgYWNlX2NoYW5uZWxfaGFuZGxlX3QgICAgY2hhbm5lbF9oYW5kbGUsDQogICAgdWludDE2X3QgKiAgICAgICAgICAgICAgaXRlcmF0b3INCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoaXMgZGVmaW5lcyB0aGUgZnVuY3Rpb24gcHJvdG90eXBlIHRoYXQgbXVzdCBiZSBmb2xsb3dlZCBieSBNU1MgQUNFIFBvc3QNCiAgUHJvY2Vzc2luZyBFbmdpbmUgKFBQRSkgZmxhZyBoYW5kbGVyIGZ1bmN0aW9ucy4gVGhlc2UgZnVuY3Rpb25zIGFyZSByZWdpc3RlcmVkDQogIHdpdGggdGhlIEFDRSBkcml2ZXIgYW5kIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgZmxhZyB0aHJvdWdoIHRoZQ0KICBBQ0VfcmVnaXN0ZXJfZmxhZ19pc3IoKSBmdW5jdGlvbi4gVGhlIEFDRSBkcml2ZXIgd2lsbCBjYWxsIHRoZSBmbGFnIGhhbmRsZXINCiAgZnVuY3Rpb24gd2hlbiB0aGUgYXNzb2NpYXRlZCBmbGFnIGlzIHJhaXNlZC4NCg0KICBEZWNsYXJpbmcgYW5kIEltcGxlbWVudGluZyBQUEUgRmxhZyBIYW5kbGVyIEZ1bmN0aW9ucw0KICBQUEUgZmxhZyBoYW5kbGVyIGZ1bmN0aW9ucyBzaG91bGQgZm9sbG93IHRoZSBmb2xsb3dpbmcgcHJvdG90eXBlOg0KICAgIHZvaWQgbXlfZmxhZ19oYW5kbGVyICggYWNlX2ZsYWdfaGFuZGxlX3QgZmxhZ19oYW5kbGUgKTsNCiAgVGhlIGFjdHVhbCBuYW1lIG9mIHRoZSBQUEUgZmxhZyBoYW5kbGVyIGlzIHVuaW1wb3J0YW50LiBZb3UgY2FuIHVzZSBhbnkgbmFtZSBvZg0KICB5b3VyIGNob2ljZSBmb3IgdGhlIFBQRSBmbGFnIGhhbmRsZXIuDQogIFRoZSBmbGFnX2hhbmRsZSBwYXJhbWV0ZXIgcGFzc2VzIHRoZSBoYW5kbGUgb2YgdGhlIHJhaXNlZCBmbGFnIHRvIHRoZSBmbGFnDQogIGhhbmRsZXIgZnVuY3Rpb24uDQogKi8NCnR5cGVkZWYgdm9pZCAoKmZsYWdfaXNyX3QpKCBhY2VfZmxhZ19oYW5kbGVfdCBmbGFnX2hhbmRsZSApOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgQUNFX3JlZ2lzdGVyX2ZsYWdfaXNyKCkgZnVuY3Rpb24gaXMgdXNlZCB0byByZWdpc3RlciBhIGhhbmRsZXIgZnVuY3Rpb24NCiAgd2l0aCB0aGUgQUNFIGRyaXZlci4gVGhlIHJlZ2lzdGVyZWQgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYnkgdGhlIEFDRSBkcml2ZXINCiAgd2hlbiB0aGUgYXNzb2NpYXRlZCBmbGFnIGlzIHJhaXNlZCBieSB0aGUgQUNFIHBvc3QgcHJvY2Vzc2luZyBlbmdpbmUuDQoNCiAgQHBhcmFtIGZsYWdfaGFuZGxlDQogICAgVGhlIGZsYWdfaGFuZGxlIHBhcmFtZXRlciBpZGVudGlmaWVzIG9uZSBvZiB0aGUgZmxhZ3MgZ2VuZXJhdGVkIGJhc2VkIG9uIHRoZQ0KICAgIHZhbHVlIG9mIGFuIGFuYWxvZyBpbnB1dCBjaGFubmVsLiBUaGUgYXZhaWxhYmxlIGZsYWcgaGFuZGxlIHZhbHVlcyBjYW4gYmUNCiAgICBmb3VuZCBpbiB0aGUgYWNlX2hhbmRsZXMuaCBmaWxlIGxvY2F0ZWQgaW4gdGhlIC5cZHJpdmVyc19jb25maWdcbXNzX2FjZQ0KICAgIHN1YmRpcmVjdG9yeS4gVGhlIGZsYWcgaGFuZGxlIHZhbHVlIGNhbiBhbHNvIGJlIHJldHJpZXZlZCB0aHJvdWdoIGEgY2FsbCB0bw0KICAgIEFDRV9nZXRfZmxhZ19oYW5kbGUoKSB3aGVuIHRoZSBuYW1lIG9mIHRoZSBmbGFnIGlzIGtub3duLCBvciBieSBpdGVyYXRpbmcNCiAgICB0aG91Z2ggYWxsIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCBhbiBhbmFsb2cgaW5wdXQgY2hhbm5lbCB1c2luZyB0aGUNCiAgICBBQ0VfZ2V0X2NoYW5uZWxfZmlyc3RfZmxhZygpIGFuZCBBQ0VfZ2V0X2NoYW5uZWxfbmV4dF9mbGFnKCkuDQoNCiAgQHBhcmFtIGZsYWdfaXNyDQogICAgVGhlIGZsYWdfaXNyIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYSBmbGFnIGhhbmRsZXIgZnVuY3Rpb24gd2l0aCB0aGUNCiAgICBmb2xsb3dpbmcgcHJvdG90eXBlOg0KICAgICAgICB2b2lkIGhhbmRsZXJfZnVuY3Rpb25fbmFtZShhY2VfZmxhZ19oYW5kbGVfdCAgZmxhZ19oYW5kbGUpDQogICAgVGhlIGZsYWcgaGFuZGxlciBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEFDRSBkcml2ZXIgYXMgcGFydCBvZiB0aGUgcmVsZXZhbnQNCiAgICBwb3N0IHByb2Nlc3NpbmcgZW5naW5lIGZsYWcgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4gSXQgZG9lcyBub3QgbmVlZCB0bw0KICAgIGhhbmRsZSBmbGFnIGludGVycnVwdCBjbGVhcmluZyBhcyB0aGlzIGlzIGRvbmUgYnkgdGhlIEFDRSBkcml2ZXIuDQoNCg0KICBAY29kZQ0KICAgIHZvaWQgbXlfY3JpdGljYWxfaGFuZGxlciggdm9pZCApOw0KDQogICAgdm9pZCBzeXN0ZW1faW5pdCggdm9pZCApDQogICAgew0KICAgICAgICBhY2VfZmxhZ19oYW5kbGVfdCBmbGFnX2hhbmRsZTsNCg0KICAgICAgICBmbGFnX2hhbmRsZSA9IEFDRV9nZXRfZmxhZ19oYW5kbGUoICJNYWluU3VwcGx5OkNyaXRpY2FsTGV2ZWwiICk7DQogICAgICAgIEFDRV9yZWdpc3Rlcl9mbGFnX2lzciggZmxhZ19oYW5kbGUsIG15X2NyaXRpY2FsX2hhbmRsZXIgKTsNCiAgICAgICAgQUNFX2VuYWJsZV9mbGFnX2lycSggZmxhZ19oYW5kbGUgKTsNCiAgICB9DQoNCiAgICB2b2lkIG15X2NyaXRpY2FsX2hhbmRsZXIoIGFjZV9mbGFnX2hhbmRsZV90IGZsYWdfaGFuZGxlICApDQogICAgew0KICAgICAgICBwYW5pYyggZmxhZ19oYW5kbGUgKTsNCiAgICB9DQoNCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZCBBQ0VfcmVnaXN0ZXJfZmxhZ19pc3INCigNCiAgICBhY2VfZmxhZ19oYW5kbGVfdCAgIGZsYWdfaGFuZGxlLA0KICAgIGZsYWdfaXNyX3QgICAgICAgICAgZmxhZ19pc3INCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoaXMgZGVmaW5lcyB0aGUgZnVuY3Rpb24gcHJvdG90eXBlIHRoYXQgbXVzdCBiZSBmb2xsb3dlZCBieSBNU1MgQUNFIFBvc3QNCiAgUHJvY2Vzc2luZyBFbmdpbmUgKFBQRSkgY2hhbm5lbCBmbGFnIGhhbmRsZXIgZnVuY3Rpb25zLiBUaGVzZSBmdW5jdGlvbnMgYXJlDQogIHJlZ2lzdGVyZWQgd2l0aCB0aGUgQUNFIGRyaXZlciBhbmQgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBBREMgaW5wdXQNCiAgY2hhbm5lbCB0aHJvdWdoIHRoZSBBQ0VfcmVnaXN0ZXJfY2hhbm5lbF9mbGFnc19pc3IoKSBmdW5jdGlvbi4gVGhlIEFDRSBkcml2ZXINCiAgd2lsbCBjYWxsIHRoZSBjaGFubmVsIGZsYWdzIGhhbmRsZXIgZnVuY3Rpb24gd2hlbiBvbmUgb2YgdGhlIGZsYWdzIGZvciB0aGUNCiAgYXNzb2NpYXRlZCBBREMgaW5wdXQgY2hhbm5lbCBpcyByYWlzZWQuDQoNCiAgRGVjbGFyaW5nIGFuZCBJbXBsZW1lbnRpbmcgUFBFIENoYW5uZWwgRmxhZyBIYW5kbGVyIEZ1bmN0aW9ucw0KICBQUEUgY2hhbm5lbCBmbGFnIGhhbmRsZXIgZnVuY3Rpb25zIHNob3VsZCBmb2xsb3cgdGhlIGZvbGxvd2luZyBwcm90b3R5cGU6DQogICAgdm9pZCBteV9jaGFubmVsX2ZsYWdfaGFuZGxlciAoIGFjZV9mbGFnX2hhbmRsZV90IGZsYWdfaGFuZGxlICk7DQogICAgVGhlIGFjdHVhbCBuYW1lIG9mIHRoZSBQUEUgY2hhbm5lbCBmbGFnIGhhbmRsZXIgaXMgdW5pbXBvcnRhbnQuIFlvdSBjYW4gdXNlDQogICAgYW55IG5hbWUgb2YgeW91ciBjaG9pY2UgZm9yIHRoZSBQUEUgY2hhbm5lbCBmbGFnIGhhbmRsZXIuIFRoZSBmbGFnX2hhbmRsZQ0KICAgIHBhcmFtZXRlciBwYXNzZXMgdGhlIGhhbmRsZSBvZiB0aGUgcmFpc2VkIGZsYWcgdG8gdGhlIGNoYW5uZWwgZmxhZyBoYW5kbGVyDQogICAgZnVuY3Rpb24uDQogKi8NCnR5cGVkZWYgdm9pZCAoKmNoYW5uZWxfZmxhZ19pc3JfdCkoIGFjZV9mbGFnX2hhbmRsZV90IGZsYWdfaGFuZGxlICk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfcmVnaXN0ZXJfY2hhbm5lbF9mbGFnc19pc3IoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgZmxhZw0KICBpbnRlcnJ1cHQgaGFuZGxlciBmdW5jdGlvbiB3aXRoIHRoZSBBQ0UgZHJpdmVyLiBUaGUgcmVnaXN0ZXJlZCBpbnRlcnJ1cHQNCiAgaGFuZGxlciB3aWxsIGJlIGNhbGxlZCBieSB0aGUgQUNFIGRyaXZlciB3aGVuIG9uZSBvZiB0aGUgZmxhZyBnZW5lcmF0ZWQgYmFzZWQNCiAgb24gdGhlIHZhbHVlIG9mIHRoZSBhbmFsb2cgaW5wdXQgY2hhbm5lbCBpZGVudGlmaWVkIGJ5IHRoZSBjaGFubmVsIGhhbmRsZQ0KICBwYXNzZWQgYXMgcGFyYW1ldGVyIGlzIGFzc2VydGVkLg0KDQogICBAcGFyYW0gY2hhbm5lbF9oYW5kbGUNCiAgICBUaGUgY2hhbm5lbF9oYW5kbGUgcGFyYW1ldGVyIGlkZW50aWZpZXMgb25lIG9mIHRoZSBhbmFsb2cgaW5wdXQgY2hhbm5lbHMNCiAgICBtb25pdG9yZWQgYnkgdGhlIEFDRS4gVGhlIGF2YWlsYWJsZSBjaGFubmVsIGhhbmRsZSB2YWx1ZXMgY2FuIGJlIGZvdW5kIGluIHRoZQ0KICAgIGFjZV9oYW5kbGVzLmggZmlsZSBsb2NhdGVkIGluIHRoZSAuL2RyaXZlcnNfY29uZmlnL21zc19hY2Ugc3ViZGlyZWN0b3J5LiBUaGUNCiAgICBjaGFubmVsIGhhbmRsZSB2YWx1ZSBjYW4gYWxzbyBiZSByZXRyaWV2ZWQgdGhyb3VnaCBhIGNhbGwgdG8NCiAgICBBQ0VfZ2V0X2NoYW5uZWxfaGFuZGxlKCkgd2hlbiB0aGUgbmFtZSBvZiB0aGUgY2hhbm5lbCBpcyBrbm93biwgb3IgYnkNCiAgICBpdGVyYXRpbmcgdGhvdWdoIGFsbCBhbmFsb2cgaW5wdXQgY2hhbm5lbCB1c2luZyB0aGUgQUNFX2dldF9maXJzdF9jaGFubmVsKCkNCiAgICBhbmQgQUNFX2dldF9uZXh0X2NoYW5uZWwoKS4NCg0KICBAcGFyYW0gY2hhbm5lbF9mbGFnX2lzcg0KICAgIFRoZSBjaGFubmVsX2ZsYWdfaXNyIHBhcmFtZXRlciBpcyBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdGFraW5nIGEgZmxhZyBoYW5kbGUNCiAgICBhcyBwYXJhbWV0ZXIuDQogICAgICAgIHZvaWQgaGFuZGxlcl9mdW5jdGlvbl9uYW1lKGFjZV9mbGFnX2hhbmRsZV90ICBmbGFnX2hhbmRsZSkNCiAgICBUaGUgZmxhZyBoYW5kbGVyIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgQUNFIGRyaXZlciBhcyBwYXJ0IG9mIHRoZSByZWxldmFudA0KICAgIHBvc3QgcHJvY2Vzc2luZyBlbmdpbmUgZmxhZyBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLiBJdCBkb2VzIG5vdCBuZWVkIHRvDQogICAgaGFuZGxlIGZsYWcgaW50ZXJydXB0IGNsZWFyaW5nIGFzIHRoaXMgaXMgZG9uZSBieSB0aGUgQUNFIGRyaXZlci4NCg0KICBFeGFtcGxlDQogICAgVGhlIGV4YW1wbGUgYmVsb3cgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgdGhlIEFDRV9yZWdpc3Rlcl9jaGFubmVsX2ZsYWdzX2lzcigpDQogICAgZnVuY3Rpb24gaW4gYSBzeXN0ZW0gd2hlcmUgdGhlIEFDRSBpcyBjb25maWd1cmVkIHRvIGhhdmUgYW4gYW5hbG9nIGlucHV0DQogICAgY2hhbm5lbHMgbmFtZWQgIk1haW5TdXBwbHkiIHdpdGggb25lIGZsYWcgbmFtZWQgIkNyaXRpY2FsIiBnZW5lcmF0ZWQgYmFzZWQNCiAgICBvbiB0aGUgdmFsdWUgb2YgIk1haW5TdXBwbHkiIGNoYW5uZWwuIFRoZSBuYW1lcyAiTWFpblN1cHBseSIgYW5kICJDcml0aWNhbCINCiAgICB3ZXJlIHVzZXIgc2VsZWN0ZWQgaW4gdGhlIEFDRSBjb25maWd1cmF0b3IuDQogIEBjb2RlDQogICAgdm9pZCBtYWluX3N1cHBseV9oYW5kbGVyIChhY2VfZmxhZ19oYW5kbGVfdCBmbGFnX2hhbmRsZSk7DQoNCiAgICB2b2lkIHN5c3RlbV9pbml0KHZvaWQpDQogICAgew0KICAgICAgICBBQ0VfcmVnaXN0ZXJfY2hhbm5lbF9mbGFnX2lzcihNYWluU3VwcGx5LCBtYWluX3N1cHBseV9oYW5kbGVyKTsNCiAgICAgICAgQUNFX2VuYWJsZV9jaGFubmVsX2ZsYWdzX2lycShNYWluU3VwcGx5KTsNCiAgICB9DQoNCiAgICB2b2lkIG1haW5fc3VwcGx5X2hhbmRsZXIgKGFjZV9mbGFnX2hhbmRsZV90IGZsYWdfaGFuZGxlKQ0KICAgIHsNCiAgICAgICAgaWYgKE1haW5TdXBwbHlfQ3JpdGljYWwgPT0gZmxhZ19oYW5kbGUpDQogICAgICAgIHsNCiAgICAgICAgICAgIHBhbmljKGZsYWdfaGFuZGxlKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICBAZW5kY29kZQ0KKi8NCnZvaWQgQUNFX3JlZ2lzdGVyX2NoYW5uZWxfZmxhZ3NfaXNyDQooDQogICAgYWNlX2NoYW5uZWxfaGFuZGxlX3QgICAgY2hhbm5lbF9oYW5kbGUsDQogICAgY2hhbm5lbF9mbGFnX2lzcl90ICAgICAgY2hhbm5lbF9mbGFnX2lzcg0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhpcyBkZWZpbmVzIHRoZSBmdW5jdGlvbiBwcm90b3R5cGUgdGhhdCBtdXN0IGJlIGZvbGxvd2VkIGJ5IE1TUyBBQ0UgUG9zdA0KICBQcm9jZXNzaW5nIEVuZ2luZSAoUFBFKSBnbG9iYWwgZmxhZyBoYW5kbGVyIGZ1bmN0aW9ucy4gVGhlc2UgZnVuY3Rpb25zIGFyZQ0KICByZWdpc3RlcmVkIHdpdGggdGhlIEFDRSBkcml2ZXIgdGhyb3VnaCB0aGUgQUNFX3JlZ2lzdGVyX2dsb2JhbF9mbGFnc19pc3IoKQ0KICBmdW5jdGlvbi4gVGhlIEFDRSBkcml2ZXIgd2lsbCBjYWxsIHRoZSBnbG9iYWwgZmxhZ3MgaGFuZGxlciBmdW5jdGlvbiB3aGVuIGFueQ0KICBmbGFnIGZvciBhbnkgQURDIGlucHV0IGNoYW5uZWwgaXMgcmFpc2VkLg0KDQogIERlY2xhcmluZyBhbmQgSW1wbGVtZW50aW5nIEdsb2JhbCBGbGFnIEhhbmRsZXIgRnVuY3Rpb25zDQogIFBQRSBnbG9iYWwgZmxhZyBoYW5kbGVyIGZ1bmN0aW9ucyBzaG91bGQgZm9sbG93IHRoZSBmb2xsb3dpbmcgcHJvdG90eXBlOg0KICAgIHZvaWQgbXlfZ2xvYmFsX2ZsYWdfaGFuZGxlcigNCiAgICAgICAgYWNlX2ZsYWdfaGFuZGxlX3QgZmxhZ19oYW5kbGUsDQogICAgICAgIGFjZV9jaGFubmVsX2hhbmRsZV90IGNoYW5uZWxfaGFuZGxlDQogICAgKTsNCiAgVGhlIGFjdHVhbCBuYW1lIG9mIHRoZSBQUEUgZ2xvYmFsIGZsYWcgaGFuZGxlciBpcyB1bmltcG9ydGFudC4gWW91IGNhbiB1c2UgYW55DQogIG5hbWUgb2YgeW91ciBjaG9pY2UgZm9yIHRoZSBQUEUgZ2xvYmFsIGZsYWcgaGFuZGxlci4gVGhlIGZsYWdfaGFuZGxlIHBhcmFtZXRlcg0KICBwYXNzZXMgdGhlIGhhbmRsZSBvZiB0aGUgcmFpc2VkIGZsYWcgdG8gdGhlIGdsb2JhbCBmbGFnIGhhbmRsZXIgZnVuY3Rpb24uIFRoZQ0KICBjaGFubmVsX2hhbmRsZSBwYXJhbWV0ZXIgcGFzc2VzIHRoZSBoYW5kbGUgb2YgdGhlIGNoYW5uZWwgZm9yIHdoaWNoIHRoZSBmbGFnDQogIHdhcyByYWlzZWQgdG8gdGhlIGdsb2JhbCBmbGFnIGhhbmRsZXIgZnVuY3Rpb24uDQoNCiAqLw0KdHlwZWRlZiB2b2lkICgqZ2xvYmFsX2ZsYWdfaXNyX3QpKCBhY2VfZmxhZ19oYW5kbGVfdCBmbGFnX2hhbmRsZSwgYWNlX2NoYW5uZWxfaGFuZGxlX3QgY2hhbm5lbF9oYW5kbGUgKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV9yZWdpc3Rlcl9nbG9iYWxfZmxhZ3NfaXNyKCkgZnVuY3Rpb24gaXMgdXNlZCB0byByZWdpc3RlciBhIGdsb2JhbA0KICBmbGFnIGhhbmRsZXIgZnVuY3Rpb24gd2l0aCB0aGUgQUNFIGRyaXZlci4gVGhlIHJlZ2lzdGVyZWQgZ2xvYmFsIGhhbmRsZXIgd2lsbA0KICBiZSBjYWxsZWQgd2hlbiBhbnkgZmxhZyBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkLg0KDQogIEBwYXJhbSBnbG9iYWxfZmxhZ19pc3INCiAgICBUaGUgZ2xvYmFsX2ZsYWdfaXNyIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0YWtpbmcgYSBmbGFnDQogICAgaGFuZGxlIGFuZCBjaGFubmVsIGhhbmRsZSBhcyBwYXJhbWV0ZXIuDQogKi8NCnZvaWQgQUNFX3JlZ2lzdGVyX2dsb2JhbF9mbGFnc19pc3INCigNCiAgICBnbG9iYWxfZmxhZ19pc3JfdCAgZ2xvYmFsX2ZsYWdfaXNyDQopOw0KDQovKiogQH0gKi8NCg0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8vKioNCiAgQGRlZmdyb3VwIGdyb3VwMTEgQ29udmVyc2lvbiBGdW5jdGlvbnMNCiAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gY29udmVydCBhbiBBREMgc2FtcGxlIHZhbHVlIHRvIGEgcmVhbA0KICB3b3JsZCB1bml0Lg0KICBAew0KICovLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV9jb252ZXJ0X2FkY19pbnB1dF90b19tVigpIGZ1bmN0aW9uIGNvbnZlcnRzIGFuIEFEQyBzYW1wbGUgdmFsdWUgaW50bw0KICB0aGUgdmFsdWUgaW4gbWlsbGl2b2x0cyBvZiB0aGUgdm9sdGFnZSBzZWVuIGF0IEFEQyBpbnB1dC4gSXQgZG9lcyBub3QgYWNjb3VudA0KICBmb3IgcHJlc2NhbGluZyB0YWtpbmcgcGxhY2UgYmVmb3JlIHRoZSBBREMgaGFyZHdhcmUgaW5wdXQuDQoNCiAgIEBwYXJhbSBjaGFubmVsX2hhbmRsZQ0KICAgIFRoZSBjaGFubmVsX2hhbmRsZSBwYXJhbWV0ZXIgaWRlbnRpZmllcyBvbmUgb2YgdGhlIGFuYWxvZyBpbnB1dCBjaGFubmVscw0KICAgIG1vbml0b3JlZCBieSB0aGUgQUNFLiBUaGUgYXZhaWxhYmxlIGNoYW5uZWwgaGFuZGxlIHZhbHVlcyBjYW4gYmUgZm91bmQgaW4gdGhlDQogICAgYWNlX2hhbmRsZXMuaCBmaWxlIGxvY2F0ZWQgaW4gdGhlIC4vZHJpdmVyc19jb25maWcvbXNzX2FjZSBzdWJkaXJlY3RvcnkuIFRoZQ0KICAgIGNoYW5uZWwgaGFuZGxlIHZhbHVlIGNhbiBhbHNvIGJlIHJldHJpZXZlZCB0aHJvdWdoIGEgY2FsbCB0bw0KICAgIEFDRV9nZXRfY2hhbm5lbF9oYW5kbGUoKSB3aGVuIHRoZSBuYW1lIG9mIHRoZSBjaGFubmVsIGlzIGtub3duLCBvciBieQ0KICAgIGl0ZXJhdGluZyB0aG91Z2ggYWxsIGFuYWxvZyBpbnB1dCBjaGFubmVsIHVzaW5nIHRoZSBBQ0VfZ2V0X2ZpcnN0X2NoYW5uZWwoKQ0KICAgIGFuZCBBQ0VfZ2V0X25leHRfY2hhbm5lbCgpLg0KDQogIEBwYXJhbSBzYW1wbGVfdmFsdWUNCiAgICBUaGUgc2FtcGxlX3ZhbHVlIHBhcmFtZXRlciBpcyB0aGUgcmVzdWx0IG9mIGFuIGFuYWxvZyB0byBkaWdpdGFsIGNvbnZlcnNpb24uDQoNCiAgQHJldHVybg0KICAgIFRoZSBBQ0VfY29udmVydF9hZGNfaW5wdXRfdG9fbVYoKSByZXR1cm5zIHRoZSBudW1iZXIgb2YgbWlsbGl2b2x0cyBkZXJpdmVkDQogICAgZnJvbSB0aGUgQURDIHNhbXBsZSB2YWx1ZSBwYXNzZWQgYXMgcGFyYW1ldGVyLg0KICovDQp1aW50MzJfdCBBQ0VfY29udmVydF9hZGNfaW5wdXRfdG9fbVYNCigNCiAgICBhY2VfY2hhbm5lbF9oYW5kbGVfdCAgICBjaGFubmVsX2hhbmRsZSwNCiAgICB1aW50MTZfdCAgICAgICAgICAgICAgICBzYW1wbGVfdmFsdWUNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfY29udmVydF90b19tVigpIGZ1bmN0aW9uIGNvbnZlcnRzIGEgUFBFIHNhbXBsZSB2YWx1ZSBpbnRvIG1pbGxpLVZvbHRzLg0KICBJdCBoYW5kbGVzIHByZXNjYWxpbmcgYWRqdXNtZW50cyBiYXNlZCBvbiBBQ0UgY29uZmlndXJhdGlvbiBmb3IgQUJQUyBpbnB1dHMuDQoNCiAgIEBwYXJhbSBjaGFubmVsX2hhbmRsZQ0KICAgIFRoZSBjaGFubmVsX2hhbmRsZSBwYXJhbWV0ZXIgaWRlbnRpZmllcyBvbmUgb2YgdGhlIGFuYWxvZyBpbnB1dCBjaGFubmVscw0KICAgIG1vbml0b3JlZCBieSB0aGUgQUNFLiBUaGUgYXZhaWxhYmxlIGNoYW5uZWwgaGFuZGxlIHZhbHVlcyBjYW4gYmUgZm91bmQgaW4gdGhlDQogICAgYWNlX2hhbmRsZXMuaCBmaWxlIGxvY2F0ZWQgaW4gdGhlIC4vZHJpdmVyc19jb25maWcvbXNzX2FjZSBzdWJkaXJlY3RvcnkuIFRoZQ0KICAgIGNoYW5uZWwgaGFuZGxlIHZhbHVlIGNhbiBhbHNvIGJlIHJldHJpZXZlZCB0aHJvdWdoIGEgY2FsbCB0bw0KICAgIEFDRV9nZXRfY2hhbm5lbF9oYW5kbGUoKSB3aGVuIHRoZSBuYW1lIG9mIHRoZSBjaGFubmVsIGlzIGtub3duLCBvciBieQ0KICAgIGl0ZXJhdGluZyB0aG91Z2ggYWxsIGFuYWxvZyBpbnB1dCBjaGFubmVsIHVzaW5nIHRoZSBBQ0VfZ2V0X2ZpcnN0X2NoYW5uZWwoKQ0KICAgIGFuZCBBQ0VfZ2V0X25leHRfY2hhbm5lbCgpLg0KDQogIEBwYXJhbSBzYW1wbGVfdmFsdWUNCiAgICBUaGUgc2FtcGxlX3ZhbHVlIHBhcmFtZXRlciBpcyB0aGUgcmVzdWx0IG9mIGFuIGFuYWxvZyB0byBkaWdpdGFsIGNvbnZlcnNpb24uDQoNCiAgQHJldHVybg0KICAgIFRoZSBBQ0VfY29udmVydF90b19tVigpIHJldHVybnMgdGhlIG51bWJlciBvZiBtaWxsaXZvbHRzIGRlcml2ZWQgZnJvbSB0aGUNCiAgICBQUEUgc2FtcGxlIHZhbHVlIHBhc3NlZCBhcyBwYXJhbWV0ZXIuIFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmUgZWl0aGVyDQogICAgcG9zaXRpdmUgb3IgbmVnYXRpdmUgc2luY2UgcHJlc2NhbGluZyBpcyBhY2NvdW50ZWQgZm9yIGluIHRoZSBjb252ZXJzaW9uLg0KICovDQppbnQzMl90IEFDRV9jb252ZXJ0X3RvX21WDQooDQogICAgYWNlX2NoYW5uZWxfaGFuZGxlX3QgICAgY2hhbm5lbF9oYW5kbGUsDQogICAgdWludDE2X3QgICAgICAgICAgICAgICAgc2FtcGxlX3ZhbHVlDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgQUNFX2NvbnZlcnRfdG9fbUEoKSBmdW5jdGlvbiBjb252ZXJ0cyBhIFBQRSBzYW1wbGUgdmFsdWUgaW50byBtaWxsaS1BbXBzLg0KICBUaGUgcmVzdWx0IG9mIHRoZSBjb252ZXJzaW9uIGlzIG9ubHkgbWVhbmluZ2Z1bCBpZiB0aGUgUFBFIHNhbXBsZSB2YWx1ZQ0KICByZXN1bHRzIGZyb20gdGhlIGNvbnZlcnNpb24gb2YgYSBjdXJyZW50IG1vbml0b3IgaW5wdXQuDQoNCiAgIEBwYXJhbSBjaGFubmVsX2hhbmRsZQ0KICAgIFRoZSBjaGFubmVsX2hhbmRsZSBwYXJhbWV0ZXIgaWRlbnRpZmllcyBvbmUgb2YgdGhlIGFuYWxvZyBpbnB1dCBjaGFubmVscw0KICAgIG1vbml0b3JlZCBieSB0aGUgQUNFLiBUaGUgYXZhaWxhYmxlIGNoYW5uZWwgaGFuZGxlIHZhbHVlcyBjYW4gYmUgZm91bmQgaW4gdGhlDQogICAgYWNlX2hhbmRsZXMuaCBmaWxlIGxvY2F0ZWQgaW4gdGhlIC4vZHJpdmVyc19jb25maWcvbXNzX2FjZSBzdWJkaXJlY3RvcnkuIFRoZQ0KICAgIGNoYW5uZWwgaGFuZGxlIHZhbHVlIGNhbiBhbHNvIGJlIHJldHJpZXZlZCB0aHJvdWdoIGEgY2FsbCB0bw0KICAgIEFDRV9nZXRfY2hhbm5lbF9oYW5kbGUoKSB3aGVuIHRoZSBuYW1lIG9mIHRoZSBjaGFubmVsIGlzIGtub3duLCBvciBieQ0KICAgIGl0ZXJhdGluZyB0aG91Z2ggYWxsIGFuYWxvZyBpbnB1dCBjaGFubmVsIHVzaW5nIHRoZSBBQ0VfZ2V0X2ZpcnN0X2NoYW5uZWwoKQ0KICAgIGFuZCBBQ0VfZ2V0X25leHRfY2hhbm5lbCgpLg0KDQogIEBwYXJhbSBzYW1wbGVfdmFsdWUNCiAgICBUaGUgc2FtcGxlX3ZhbHVlIHBhcmFtZXRlciBpcyB0aGUgcmVzdWx0IG9mIGFuIGFuYWxvZyB0byBkaWdpdGFsIGNvbnZlcnNpb24NCiAgICBvZiB0aGUgdm9sdGFnZSBnZW5lcmF0ZWQgYnkgYSBjdXJyZW50IG1vbml0b3IgYW5hbG9nIGJsb2NrLg0KDQogIEByZXR1cm4NCiAgICBUaGUgQUNFX2NvbnZlcnRfdG9fbUEoKSByZXR1cm5zIHRoZSBudW1iZXIgb2YgbWlsbGlhbXBzIGRlcml2ZWQgZnJvbSB0aGUNCiAgICBQUEUgc2FtcGxlIHZhbHVlIHBhc3NlZCBhcyBwYXJhbWV0ZXIuDQogKi8NCnVpbnQzMl90IEFDRV9jb252ZXJ0X3RvX21BDQooDQogICAgYWNlX2NoYW5uZWxfaGFuZGxlX3QgICAgY2hhbm5lbF9oYW5kbGUsDQogICAgdWludDE2X3QgICAgICAgICAgICAgICAgc2FtcGxlX3ZhbHVlDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgQUNFX2NvbnZlcnRfdG9fS2VsdmluKCkgZnVuY3Rpb24gY29udmVydHMgYSBQUEUgc2FtcGxlIHZhbHVlIGludG8gZGVncmVlcw0KICBLZWx2aW4uIFRoZSByZXN1bHQgb2YgdGhlIGNvbnZlcnNpb24gaXMgb25seSBtZWFuaW5nZnVsIGlmIHRoZSBQUEUgc2FtcGxlIHZhbHVlDQogIHJlc3VsdHMgZnJvbSB0aGUgY29udmVyc2lvbiBvZiBhIHRlbXBlcmF0dXJlIG1vbml0b3IgaW5wdXQuDQoNCiAgIEBwYXJhbSBjaGFubmVsX2hhbmRsZQ0KICAgIFRoZSBjaGFubmVsX2hhbmRsZSBwYXJhbWV0ZXIgaWRlbnRpZmllcyBvbmUgb2YgdGhlIGFuYWxvZyBpbnB1dCBjaGFubmVscw0KICAgIG1vbml0b3JlZCBieSB0aGUgQUNFLiBUaGUgYXZhaWxhYmxlIGNoYW5uZWwgaGFuZGxlIHZhbHVlcyBjYW4gYmUgZm91bmQgaW4gdGhlDQogICAgYWNlX2hhbmRsZXMuaCBmaWxlIGxvY2F0ZWQgaW4gdGhlIC4vZHJpdmVyc19jb25maWcvbXNzX2FjZSBzdWJkaXJlY3RvcnkuIFRoZQ0KICAgIGNoYW5uZWwgaGFuZGxlIHZhbHVlIGNhbiBhbHNvIGJlIHJldHJpZXZlZCB0aHJvdWdoIGEgY2FsbCB0bw0KICAgIEFDRV9nZXRfY2hhbm5lbF9oYW5kbGUoKSB3aGVuIHRoZSBuYW1lIG9mIHRoZSBjaGFubmVsIGlzIGtub3duLCBvciBieQ0KICAgIGl0ZXJhdGluZyB0aG91Z2ggYWxsIGFuYWxvZyBpbnB1dCBjaGFubmVsIHVzaW5nIHRoZSBBQ0VfZ2V0X2ZpcnN0X2NoYW5uZWwoKQ0KICAgIGFuZCBBQ0VfZ2V0X25leHRfY2hhbm5lbCgpLg0KDQogIEBwYXJhbSBzYW1wbGVfdmFsdWUNCiAgICBUaGUgc2FtcGxlX3ZhbHVlIHBhcmFtZXRlciBpcyB0aGUgcmVzdWx0IG9mIGFuIGFuYWxvZyB0byBkaWdpdGFsIGNvbnZlcnNpb24NCiAgICBvZiB0aGUgdm9sdGFnZSBnZW5lcmF0ZWQgYnkgYSB0ZW1wZXJhdHVyZSBtb25pdG9yIGFuYWxvZyBibG9jay4NCg0KICBAcmV0dXJuDQogICAgVGhlIEFDRV9jb252ZXJ0X3RvX0tlbHZpbigpIHJldHVybnMgdGhlIG51bWJlciBvZiBkZWdyZWVzIEtlbHZpbiBkZXJpdmVkDQogICAgZnJvbSB0aGUgUFBFIHNhbXBsZSB2YWx1ZSBwYXNzZWQgYXMgcGFyYW1ldGVyLg0KICovDQp1aW50MzJfdCBBQ0VfY29udmVydF90b19LZWx2aW4NCigNCiAgICBhY2VfY2hhbm5lbF9oYW5kbGVfdCAgICBjaGFubmVsX2hhbmRsZSwNCiAgICB1aW50MTZfdCAgICAgICAgICAgICAgICBzYW1wbGVfdmFsdWUNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfY29udmVydF90b19DZWxzaXVzKCkgZnVuY3Rpb24gY29udmVydHMgYSBQUEUgc2FtcGxlIHZhbHVlIGludG8gdGVudGhzDQogIG9mIGRlZ3JlZXMgQ2Vsc2l1cy4gVGhlIHJlc3VsdCBvZiB0aGUgY29udmVyc2lvbiBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgdGhlIFBQRQ0KICBzYW1wbGUgdmFsdWUgcmVzdWx0cyBmcm9tIHRoZSBjb252ZXJzaW9uIG9mIGEgdGVtcGVyYXR1cmUgbW9uaXRvciBpbnB1dC4NCg0KICAgQHBhcmFtIGNoYW5uZWxfaGFuZGxlDQogICAgVGhlIGNoYW5uZWxfaGFuZGxlIHBhcmFtZXRlciBpZGVudGlmaWVzIG9uZSBvZiB0aGUgYW5hbG9nIGlucHV0IGNoYW5uZWxzDQogICAgbW9uaXRvcmVkIGJ5IHRoZSBBQ0UuIFRoZSBhdmFpbGFibGUgY2hhbm5lbCBoYW5kbGUgdmFsdWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUNCiAgICBhY2VfaGFuZGxlcy5oIGZpbGUgbG9jYXRlZCBpbiB0aGUgLi9kcml2ZXJzX2NvbmZpZy9tc3NfYWNlIHN1YmRpcmVjdG9yeS4gVGhlDQogICAgY2hhbm5lbCBoYW5kbGUgdmFsdWUgY2FuIGFsc28gYmUgcmV0cmlldmVkIHRocm91Z2ggYSBjYWxsIHRvDQogICAgQUNFX2dldF9jaGFubmVsX2hhbmRsZSgpIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGNoYW5uZWwgaXMga25vd24sIG9yIGJ5DQogICAgaXRlcmF0aW5nIHRob3VnaCBhbGwgYW5hbG9nIGlucHV0IGNoYW5uZWwgdXNpbmcgdGhlIEFDRV9nZXRfZmlyc3RfY2hhbm5lbCgpDQogICAgYW5kIEFDRV9nZXRfbmV4dF9jaGFubmVsKCkuDQoNCiAgQHBhcmFtIHNhbXBsZV92YWx1ZQ0KICAgIFRoZSBzYW1wbGVfdmFsdWUgcGFyYW1ldGVyIGlzIHRoZSByZXN1bHQgb2YgYW4gYW5hbG9nIHRvIGRpZ2l0YWwgY29udmVyc2lvbg0KICAgIG9mIHRoZSB2b2x0YWdlIGdlbmVyYXRlZCBieSBhIHRlbXBlcmF0dXJlIG1vbml0b3IgYW5hbG9nIGJsb2NrLg0KDQogIEByZXR1cm4NCiAgICBUaGUgQUNFX2NvbnZlcnRfdG9fQ2Vsc2l1cygpIHJldHVybnMgdGhlIG51bWJlciBvZiB0ZW50aHMgb2YgZGVncmVlcyBDZWxzaXVzDQogICAgZGVyaXZlZCBmcm9tIHRoZSBQUEUgc2FtcGxlIHZhbHVlIHBhc3NlZCBhcyBwYXJhbWV0ZXIuDQogKi8NCmludDMyX3QgQUNFX2NvbnZlcnRfdG9fQ2Vsc2l1cw0KKA0KICAgIGFjZV9jaGFubmVsX2hhbmRsZV90ICAgIGNoYW5uZWxfaGFuZGxlLA0KICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgIHNhbXBsZV92YWx1ZQ0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV9jb252ZXJ0X3RvX0ZhaHJlbmhlaXQoKSBmdW5jdGlvbiBjb252ZXJ0cyBhIFBQRSBzYW1wbGUgdmFsdWUgaW50bw0KICBkZWdyZWVzIEZhaHJlbmhlaXQuIFRoZSByZXN1bHQgb2YgdGhlIGNvbnZlcnNpb24gaXMgb25seSBtZWFuaW5nZnVsIGlmIHRoZSBQUEUNCiAgc2FtcGxlIHZhbHVlIHJlc3VsdHMgZnJvbSB0aGUgY29udmVyc2lvbiBvZiBhIHRlbXBlcmF0dXJlIG1vbml0b3IgaW5wdXQuDQoNCiAgIEBwYXJhbSBjaGFubmVsX2hhbmRsZQ0KICAgIFRoZSBjaGFubmVsX2hhbmRsZSBwYXJhbWV0ZXIgaWRlbnRpZmllcyBvbmUgb2YgdGhlIGFuYWxvZyBpbnB1dCBjaGFubmVscw0KICAgIG1vbml0b3JlZCBieSB0aGUgQUNFLiBUaGUgYXZhaWxhYmxlIGNoYW5uZWwgaGFuZGxlIHZhbHVlcyBjYW4gYmUgZm91bmQgaW4gdGhlDQogICAgYWNlX2hhbmRsZXMuaCBmaWxlIGxvY2F0ZWQgaW4gdGhlIC4vZHJpdmVyc19jb25maWcvbXNzX2FjZSBzdWJkaXJlY3RvcnkuIFRoZQ0KICAgIGNoYW5uZWwgaGFuZGxlIHZhbHVlIGNhbiBhbHNvIGJlIHJldHJpZXZlZCB0aHJvdWdoIGEgY2FsbCB0bw0KICAgIEFDRV9nZXRfY2hhbm5lbF9oYW5kbGUoKSB3aGVuIHRoZSBuYW1lIG9mIHRoZSBjaGFubmVsIGlzIGtub3duLCBvciBieQ0KICAgIGl0ZXJhdGluZyB0aG91Z2ggYWxsIGFuYWxvZyBpbnB1dCBjaGFubmVsIHVzaW5nIHRoZSBBQ0VfZ2V0X2ZpcnN0X2NoYW5uZWwoKQ0KICAgIGFuZCBBQ0VfZ2V0X25leHRfY2hhbm5lbCgpLg0KDQogIEBwYXJhbSBzYW1wbGVfdmFsdWUNCiAgICBUaGUgc2FtcGxlX3ZhbHVlIHBhcmFtZXRlciBpcyB0aGUgcmVzdWx0IG9mIGFuIGFuYWxvZyB0byBkaWdpdGFsIGNvbnZlcnNpb24NCiAgICBvZiB0aGUgdm9sdGFnZSBnZW5lcmF0ZWQgYnkgYSB0ZW1wZXJhdHVyZSBtb25pdG9yIGFuYWxvZyBibG9jay4NCg0KICBAcmV0dXJuDQogICAgVGhlIEFDRV9jb252ZXJ0X3RvX0ZhaHJlbmhlaXQoKSByZXR1cm5zIHRoZSBudW1iZXIgb2YgZGVncmVlcyBGYWhyZW5oZWl0DQogICAgZGVyaXZlZCBmcm9tIHRoZSBQUEUgc2FtcGxlIHZhbHVlIHBhc3NlZCBhcyBwYXJhbWV0ZXIuDQogKi8NCmludDMyX3QgQUNFX2NvbnZlcnRfdG9fRmFocmVuaGVpdA0KKA0KICAgIGFjZV9jaGFubmVsX2hhbmRsZV90ICAgIGNoYW5uZWxfaGFuZGxlLA0KICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgIHNhbXBsZV92YWx1ZQ0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV9jb252ZXJ0X21WX3RvX2FkY192YWx1ZSgpIGZ1bmN0aW9uIGNvbnZlcnRzIGEgdm9sdGFnZSB2YWx1ZSBnaXZlbiBpbg0KICBtaWxsaS1Wb2x0cyBpbnRvIHRoZSBBREMgc2FtcGxlIHZhbHVlIHRoYXQgd291bGQgcmVzdWx0IGZyb20gc2FtcGxpbmcgdGhpcw0KICB2b2x0YWdlIHZhbHVlIG9uIHRoZSBhbmFsb2cgaW5wdXQgY2hhbm5lbCBzcGVjaWZpZWQgYXMgcGFyYW1ldGVyLg0KICBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIGZvciB1c2Ugd2hlbiBkaXJlY3RseSBjb250cm9sbGluZyB0aGUgQURDLCBub3Qgd2hlbg0KICB1c2luZyBzYW1wbGVzIHJlYWQgZnJvbSB0aGUgUFBFLiBJdCBkb2VzIG5vdCBhY2NvdW50IGZvciBwcmVzY2FsaW5nIHRha2luZw0KICBwbGFjZSBiZWZvcmUgdGhlIEFEQyBoYXJkd2FyZSBpbnB1dC4NCg0KICAgQHBhcmFtIGNoYW5uZWxfaGFuZGxlDQogICAgVGhlIGNoYW5uZWxfaGFuZGxlIHBhcmFtZXRlciBpZGVudGlmaWVzIG9uZSBvZiB0aGUgYW5hbG9nIGlucHV0IGNoYW5uZWxzDQogICAgbW9uaXRvcmVkIGJ5IHRoZSBBQ0UuIFRoZSBhdmFpbGFibGUgY2hhbm5lbCBoYW5kbGUgdmFsdWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUNCiAgICBhY2VfaGFuZGxlcy5oIGZpbGUgbG9jYXRlZCBpbiB0aGUgLi9kcml2ZXJzX2NvbmZpZy9tc3NfYWNlIHN1YmRpcmVjdG9yeS4gVGhlDQogICAgY2hhbm5lbCBoYW5kbGUgdmFsdWUgY2FuIGFsc28gYmUgcmV0cmlldmVkIHRocm91Z2ggYSBjYWxsIHRvDQogICAgQUNFX2dldF9jaGFubmVsX2hhbmRsZSgpIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGNoYW5uZWwgaXMga25vd24sIG9yIGJ5DQogICAgaXRlcmF0aW5nIHRob3VnaCBhbGwgYW5hbG9nIGlucHV0IGNoYW5uZWwgdXNpbmcgdGhlIEFDRV9nZXRfZmlyc3RfY2hhbm5lbCgpDQogICAgYW5kIEFDRV9nZXRfbmV4dF9jaGFubmVsKCkuDQoNCiAgQHBhcmFtIHZvbHRhZ2UNCiAgICBUaGUgdm9sdGFnZSBwYXJhbWV0ZXIgaXMgdGhlIG1pbGxpLVZvbHRzIHZvbHRhZ2UgdmFsdWUgZm9yIHdoaWNoIHdlIHdhbnQgdGhpcw0KICAgIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgYXNzb2NpYXRlZCBBREMgc2FtcGxlIHJlc3VsdCB2YWx1ZS4NCg0KICBAcmV0dXJuDQogICAgVGhlIEFDRV9jb252ZXJ0X21WX3RvX2FkY192YWx1ZSgpIHJldHVybnMgdGhlIEFEQyBzYW1wbGUgdmFsdWUgdGhhdCB3b3VsZCBiZQ0KICAgIHByb2R1Y2VkIGlmIHRoZSBhbmFsb2cgaW5wdXQgY2hhbm5lbCBpZGVudGlmaWVkIGJ5IGNoYW5uZWxfaGFuZGxlIHdhcyBzZXQgdG8NCiAgICB0aGUgdm9sdGFnZSB2YWx1ZSBwYXNzZWQgYXMgc2Vjb25kIHBhcmFtZXRlci4NCiAqLw0KdWludDE2X3QgQUNFX2NvbnZlcnRfbVZfdG9fYWRjX3ZhbHVlDQooDQogICAgYWNlX2NoYW5uZWxfaGFuZGxlX3QgICAgY2hhbm5lbF9oYW5kbGUsDQogICAgdWludDMyX3QgICAgICAgICAgICAgICAgdm9sdGFnZQ0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV9jb252ZXJ0X2Zyb21fbVYoKSBmdW5jdGlvbiBjb252ZXJ0cyBhIHZvbHRhZ2UgdmFsdWUgZ2l2ZW4gaW4NCiAgbWlsbGktVm9sdHMgaW50byB0aGUgUFBFIHNhbXBsZSB2YWx1ZSB0aGF0IHdvdWxkIHJlc3VsdCBmcm9tIHNhbXBsaW5nIHRoaXMNCiAgdm9sdGFnZSB2YWx1ZSBvbiB0aGUgYW5hbG9nIGlucHV0IGNoYW5uZWwgc3BlY2lmaWVkIGFzIHBhcmFtZXRlci4NCiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHByZXNjYWxpbmcgYWRqdXNtZW50cyBiYXNlZCBvbiBBQ0UgY29uZmlndXJhdGlvbiBmb3INCiAgQUJQUyBpbnB1dHMuDQoNCiAgIEBwYXJhbSBjaGFubmVsX2hhbmRsZQ0KICAgIFRoZSBjaGFubmVsX2hhbmRsZSBwYXJhbWV0ZXIgaWRlbnRpZmllcyBvbmUgb2YgdGhlIGFuYWxvZyBpbnB1dCBjaGFubmVscw0KICAgIG1vbml0b3JlZCBieSB0aGUgQUNFLiBUaGUgYXZhaWxhYmxlIGNoYW5uZWwgaGFuZGxlIHZhbHVlcyBjYW4gYmUgZm91bmQgaW4gdGhlDQogICAgYWNlX2hhbmRsZXMuaCBmaWxlIGxvY2F0ZWQgaW4gdGhlIC4vZHJpdmVyc19jb25maWcvbXNzX2FjZSBzdWJkaXJlY3RvcnkuIFRoZQ0KICAgIGNoYW5uZWwgaGFuZGxlIHZhbHVlIGNhbiBhbHNvIGJlIHJldHJpZXZlZCB0aHJvdWdoIGEgY2FsbCB0bw0KICAgIEFDRV9nZXRfY2hhbm5lbF9oYW5kbGUoKSB3aGVuIHRoZSBuYW1lIG9mIHRoZSBjaGFubmVsIGlzIGtub3duLCBvciBieQ0KICAgIGl0ZXJhdGluZyB0aG91Z2ggYWxsIGFuYWxvZyBpbnB1dCBjaGFubmVsIHVzaW5nIHRoZSBBQ0VfZ2V0X2ZpcnN0X2NoYW5uZWwoKQ0KICAgIGFuZCBBQ0VfZ2V0X25leHRfY2hhbm5lbCgpLg0KDQogIEBwYXJhbSB2b2x0YWdlDQogICAgVGhlIHZvbHRhZ2UgcGFyYW1ldGVyIGlzIHRoZSBtaWxsaS1Wb2x0cyB2b2x0YWdlIHZhbHVlIGZvciB3aGljaCB3ZSB3YW50IHRoaXMNCiAgICBmdW5jdGlvbiB0byByZXR1cm4gdGhlIGFzc29jaWF0ZWQgUFBFIHNhbXBsZSByZXN1bHQgdmFsdWUuDQoNCiAgQHJldHVybg0KICAgIFRoZSBBQ0VfY29udmVydF9mcm9tX21WKCkgcmV0dXJucyB0aGUgUFBFIHNhbXBsZSB2YWx1ZSB0aGF0IHdvdWxkIGJlIHByb2R1Y2VkDQogICAgaWYgdGhlIGFuYWxvZyBpbnB1dCBjaGFubmVsIGlkZW50aWZpZWQgYnkgY2hhbm5lbF9oYW5kbGUgd2FzIHNldCB0byB0aGUNCiAgICB2b2x0YWdlIHZhbHVlIHBhc3NlZCBhcyBzZWNvbmQgcGFyYW1ldGVyLg0KICovDQp1aW50MTZfdCBBQ0VfY29udmVydF9mcm9tX21WDQooDQogICAgYWNlX2NoYW5uZWxfaGFuZGxlX3QgICAgY2hhbm5lbF9oYW5kbGUsDQogICAgaW50MzJfdCAgICAgICAgICAgICAgICAgdm9sdGFnZQ0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV9jb252ZXJ0X2Zyb21fbUEoKSBmdW5jdGlvbiBjb252ZXJ0cyBhIGN1cnJlbnQgdmFsdWUgZ2l2ZW4gaW4NCiAgbWlsbGktQW1wcyBpbnRvIHRoZSBQUEUgc2FtcGxlIHZhbHVlIHRoYXQgd291bGQgcmVzdWx0IGZyb20gc2FtcGxpbmcgdGhpcw0KICBjdXJyZW50IHZhbHVlIG9uIHRoZSBhbmFsb2cgaW5wdXQgY2hhbm5lbCBzcGVjaWZpZWQgYXMgcGFyYW1ldGVyLg0KICBUaGUgcmVzdWx0IG9mIHRoZSBjb252ZXJzaW9uIGlzIG9ubHkgbWVhbmluZ2Z1bCBpZiB0aGUgYW5hbG9nIGlucHV0IGNoYW5uZWwNCiAgc3BlY2lmaWVkIGFzIHBhcmFtZXRlciBpcyBjb25maWd1cmVkIGFzIGEgY3VycmVudCBtb25pdG9yaW5nIGNoYW5uZWwuDQoNCiAgIEBwYXJhbSBjaGFubmVsX2hhbmRsZQ0KICAgIFRoZSBjaGFubmVsX2hhbmRsZSBwYXJhbWV0ZXIgaWRlbnRpZmllcyBvbmUgb2YgdGhlIGFuYWxvZyBpbnB1dCBjaGFubmVscw0KICAgIG1vbml0b3JlZCBieSB0aGUgQUNFLiBUaGUgYXZhaWxhYmxlIGNoYW5uZWwgaGFuZGxlIHZhbHVlcyBjYW4gYmUgZm91bmQgaW4gdGhlDQogICAgYWNlX2hhbmRsZXMuaCBmaWxlIGxvY2F0ZWQgaW4gdGhlIC4vZHJpdmVyc19jb25maWcvbXNzX2FjZSBzdWJkaXJlY3RvcnkuIFRoZQ0KICAgIGNoYW5uZWwgaGFuZGxlIHZhbHVlIGNhbiBhbHNvIGJlIHJldHJpZXZlZCB0aHJvdWdoIGEgY2FsbCB0bw0KICAgIEFDRV9nZXRfY2hhbm5lbF9oYW5kbGUoKSB3aGVuIHRoZSBuYW1lIG9mIHRoZSBjaGFubmVsIGlzIGtub3duLCBvciBieQ0KICAgIGl0ZXJhdGluZyB0aG91Z2ggYWxsIGFuYWxvZyBpbnB1dCBjaGFubmVsIHVzaW5nIHRoZSBBQ0VfZ2V0X2ZpcnN0X2NoYW5uZWwoKQ0KICAgIGFuZCBBQ0VfZ2V0X25leHRfY2hhbm5lbCgpLg0KDQogIEBwYXJhbSBjdXJyZW50DQogICAgVGhlIGN1cnJlbnQgcGFyYW1ldGVyIGlzIHRoZSBtaWxsaS1BbXBzIGN1cnJlbnQgdmFsdWUgZm9yIHdoaWNoIHdlIHdhbnQgdGhpcw0KICAgIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgYXNzb2NpYXRlZCBQUEUgc2FtcGxlIHJlc3VsdCB2YWx1ZS4NCg0KICBAcmV0dXJuDQogICAgVGhlIEFDRV9jb252ZXJ0X2Zyb21fbUEoKSByZXR1cm5zIHRoZSBQUEUgc2FtcGxlIHZhbHVlIHRoYXQgd291bGQgYmUgcHJvZHVjZWQNCiAgICBpZiB0aGUgYW5hbG9nIGlucHV0IGNoYW5uZWwgaWRlbnRpZmllZCBieSBjaGFubmVsX2hhbmRsZSB3YXMgc2V0IHRvIHRoZQ0KICAgIGN1cnJlbnQgdmFsdWUgcGFzc2VkIGFzIHNlY29uZCBwYXJhbWV0ZXIuDQogKi8NCnVpbnQxNl90IEFDRV9jb252ZXJ0X2Zyb21fbUENCigNCiAgICBhY2VfY2hhbm5lbF9oYW5kbGVfdCAgICBjaGFubmVsX2hhbmRsZSwNCiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBjdXJyZW50DQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgQUNFX2NvbnZlcnRfZnJvbV9LZWx2aW4oKSBmdW5jdGlvbiBjb252ZXJ0cyBhIHRlbXBlcmF0dXJlIHZhbHVlIGdpdmVuIGluDQogIGRlZ3JlZXMgS2VsdmluIGludG8gdGhlIFBQRSBzYW1wbGUgdmFsdWUgdGhhdCB3b3VsZCByZXN1bHQgZnJvbSBzYW1wbGluZyB0aGlzDQogIHRlbXBlcmF0dXJlIHZhbHVlIG9uIHRoZSBhbmFsb2cgaW5wdXQgY2hhbm5lbCBzcGVjaWZpZWQgYXMgcGFyYW1ldGVyLg0KICBUaGUgcmVzdWx0IG9mIHRoZSBjb252ZXJzaW9uIGlzIG9ubHkgbWVhbmluZ2Z1bCBpZiB0aGUgYW5hbG9nIGlucHV0IGNoYW5uZWwNCiAgc3BlY2lmaWVkIGFzIHBhcmFtZXRlciBpcyBjb25maWd1cmVkIGFzIGEgdGVtcGVyYXR1cmUgbW9uaXRvcmluZyBjaGFubmVsLg0KDQogICBAcGFyYW0gY2hhbm5lbF9oYW5kbGUNCiAgICBUaGUgY2hhbm5lbF9oYW5kbGUgcGFyYW1ldGVyIGlkZW50aWZpZXMgb25lIG9mIHRoZSBhbmFsb2cgaW5wdXQgY2hhbm5lbHMNCiAgICBtb25pdG9yZWQgYnkgdGhlIEFDRS4gVGhlIGF2YWlsYWJsZSBjaGFubmVsIGhhbmRsZSB2YWx1ZXMgY2FuIGJlIGZvdW5kIGluIHRoZQ0KICAgIGFjZV9oYW5kbGVzLmggZmlsZSBsb2NhdGVkIGluIHRoZSAuL2RyaXZlcnNfY29uZmlnL21zc19hY2Ugc3ViZGlyZWN0b3J5LiBUaGUNCiAgICBjaGFubmVsIGhhbmRsZSB2YWx1ZSBjYW4gYWxzbyBiZSByZXRyaWV2ZWQgdGhyb3VnaCBhIGNhbGwgdG8NCiAgICBBQ0VfZ2V0X2NoYW5uZWxfaGFuZGxlKCkgd2hlbiB0aGUgbmFtZSBvZiB0aGUgY2hhbm5lbCBpcyBrbm93biwgb3IgYnkNCiAgICBpdGVyYXRpbmcgdGhvdWdoIGFsbCBhbmFsb2cgaW5wdXQgY2hhbm5lbCB1c2luZyB0aGUgQUNFX2dldF9maXJzdF9jaGFubmVsKCkNCiAgICBhbmQgQUNFX2dldF9uZXh0X2NoYW5uZWwoKS4NCg0KICBAcGFyYW0gdGVtcGVyYXR1cmUNCiAgICBUaGUgdGVtcGVyYXR1cmUgcGFyYW1ldGVyIGlzIHRoZSBkZWdyZWVzIEtlbHZpbiB0ZW1wZXJhdHVyZSB2YWx1ZSBmb3Igd2hpY2gNCiAgICB3ZSB3YW50IHRoaXMgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBhc3NvY2lhdGVkIFBQRSBzYW1wbGUgcmVzdWx0IHZhbHVlLg0KDQogIEByZXR1cm4NCiAgICBUaGUgQUNFX2NvbnZlcnRfZnJvbV9LZWx2aW4oKSByZXR1cm5zIHRoZSBQUEUgc2FtcGxlIHZhbHVlIHRoYXQgd291bGQgYmUNCiAgICBwcm9kdWNlZCBpZiB0aGUgYW5hbG9nIGlucHV0IGNoYW5uZWwgaWRlbnRpZmllZCBieSBjaGFubmVsX2hhbmRsZSB3YXMgc2V0IHRvDQogICAgdGhlIHRlbXBlcmF0dXJlIHZhbHVlIHBhc3NlZCBhcyBzZWNvbmQgcGFyYW1ldGVyLg0KICovDQp1aW50MTZfdCBBQ0VfY29udmVydF9mcm9tX0tlbHZpbg0KKA0KICAgIGFjZV9jaGFubmVsX2hhbmRsZV90ICAgIGNoYW5uZWxfaGFuZGxlLA0KICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIHRlbXBlcmF0dXJlDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgQUNFX2NvbnZlcnRfZnJvbV9DZWxzaXVzKCkgZnVuY3Rpb24gY29udmVydHMgYSB0ZW1wZXJhdHVyZSB2YWx1ZSBnaXZlbiBpbg0KICBkZWdyZWVzIENlbHNpdXMgaW50byB0aGUgUFBFIHNhbXBsZSB2YWx1ZSB0aGF0IHdvdWxkIHJlc3VsdCBmcm9tIHNhbXBsaW5nIHRoaXMNCiAgdGVtcGVyYXR1cmUgdmFsdWUgb24gdGhlIGFuYWxvZyBpbnB1dCBjaGFubmVsIHNwZWNpZmllZCBhcyBwYXJhbWV0ZXIuDQogIFRoZSByZXN1bHQgb2YgdGhlIGNvbnZlcnNpb24gaXMgb25seSBtZWFuaW5nZnVsIGlmIHRoZSBhbmFsb2cgaW5wdXQgY2hhbm5lbA0KICBzcGVjaWZpZWQgYXMgcGFyYW1ldGVyIGlzIGNvbmZpZ3VyZWQgYXMgYSB0ZW1wZXJhdHVyZSBtb25pdG9yaW5nIGNoYW5uZWwuDQoNCiAgIEBwYXJhbSBjaGFubmVsX2hhbmRsZQ0KICAgIFRoZSBjaGFubmVsX2hhbmRsZSBwYXJhbWV0ZXIgaWRlbnRpZmllcyBvbmUgb2YgdGhlIGFuYWxvZyBpbnB1dCBjaGFubmVscw0KICAgIG1vbml0b3JlZCBieSB0aGUgQUNFLiBUaGUgYXZhaWxhYmxlIGNoYW5uZWwgaGFuZGxlIHZhbHVlcyBjYW4gYmUgZm91bmQgaW4gdGhlDQogICAgYWNlX2hhbmRsZXMuaCBmaWxlIGxvY2F0ZWQgaW4gdGhlIC4vZHJpdmVyc19jb25maWcvbXNzX2FjZSBzdWJkaXJlY3RvcnkuIFRoZQ0KICAgIGNoYW5uZWwgaGFuZGxlIHZhbHVlIGNhbiBhbHNvIGJlIHJldHJpZXZlZCB0aHJvdWdoIGEgY2FsbCB0bw0KICAgIEFDRV9nZXRfY2hhbm5lbF9oYW5kbGUoKSB3aGVuIHRoZSBuYW1lIG9mIHRoZSBjaGFubmVsIGlzIGtub3duLCBvciBieQ0KICAgIGl0ZXJhdGluZyB0aG91Z2ggYWxsIGFuYWxvZyBpbnB1dCBjaGFubmVsIHVzaW5nIHRoZSBBQ0VfZ2V0X2ZpcnN0X2NoYW5uZWwoKQ0KICAgIGFuZCBBQ0VfZ2V0X25leHRfY2hhbm5lbCgpLg0KDQogIEBwYXJhbSB0ZW1wZXJhdHVyZQ0KICAgIFRoZSB0ZW1wZXJhdHVyZSBwYXJhbWV0ZXIgaXMgdGhlIGRlZ3JlZXMgQ2Vsc2l1cyB0ZW1wZXJhdHVyZSB2YWx1ZSBmb3Igd2hpY2gNCiAgICB3ZSB3YW50IHRoaXMgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBhc3NvY2lhdGVkIFBQRSBzYW1wbGUgcmVzdWx0IHZhbHVlLg0KDQogIEByZXR1cm4NCiAgICBUaGUgQUNFX2NvbnZlcnRfZnJvbV9DZWxzaXVzKCkgcmV0dXJucyB0aGUgUFBFIHNhbXBsZSB2YWx1ZSB0aGF0IHdvdWxkIGJlDQogICAgcHJvZHVjZWQgaWYgdGhlIGFuYWxvZyBpbnB1dCBjaGFubmVsIGlkZW50aWZpZWQgYnkgY2hhbm5lbF9oYW5kbGUgd2FzIHNldCB0bw0KICAgIHRoZSB0ZW1wZXJhdHVyZSB2YWx1ZSBwYXNzZWQgYXMgc2Vjb25kIHBhcmFtZXRlci4NCiAqLw0KdWludDE2X3QgQUNFX2NvbnZlcnRfZnJvbV9DZWxzaXVzDQooDQogICAgYWNlX2NoYW5uZWxfaGFuZGxlX3QgICAgY2hhbm5lbF9oYW5kbGUsDQogICAgaW50MzJfdCAgICAgICAgICAgICAgICAgdGVtcGVyYXR1cmUNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBBQ0VfY29udmVydF9mcm9tX0ZhaHJlbmhlaXQoKSBmdW5jdGlvbiBjb252ZXJ0cyBhIHRlbXBlcmF0dXJlIHZhbHVlIGdpdmVuDQogIGluIGRlZ3JlZXMgRmFocmVuaGVpdCBpbnRvIHRoZSBQUEUgc2FtcGxlIHZhbHVlIHRoYXQgd291bGQgcmVzdWx0IGZyb20gc2FtcGxpbmcNCiAgdGhpcyB0ZW1wZXJhdHVyZSB2YWx1ZSBvbiB0aGUgYW5hbG9nIGlucHV0IGNoYW5uZWwgc3BlY2lmaWVkIGFzIHBhcmFtZXRlci4NCiAgVGhlIHJlc3VsdCBvZiB0aGUgY29udmVyc2lvbiBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgdGhlIGFuYWxvZyBpbnB1dCBjaGFubmVsDQogIHNwZWNpZmllZCBhcyBwYXJhbWV0ZXIgaXMgY29uZmlndXJlZCBhcyBhIHRlbXBlcmF0dXJlIG1vbml0b3JpbmcgY2hhbm5lbC4NCg0KICAgQHBhcmFtIGNoYW5uZWxfaGFuZGxlDQogICAgVGhlIGNoYW5uZWxfaGFuZGxlIHBhcmFtZXRlciBpZGVudGlmaWVzIG9uZSBvZiB0aGUgYW5hbG9nIGlucHV0IGNoYW5uZWxzDQogICAgbW9uaXRvcmVkIGJ5IHRoZSBBQ0UuIFRoZSBhdmFpbGFibGUgY2hhbm5lbCBoYW5kbGUgdmFsdWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUNCiAgICBhY2VfaGFuZGxlcy5oIGZpbGUgbG9jYXRlZCBpbiB0aGUgLi9kcml2ZXJzX2NvbmZpZy9tc3NfYWNlIHN1YmRpcmVjdG9yeS4gVGhlDQogICAgY2hhbm5lbCBoYW5kbGUgdmFsdWUgY2FuIGFsc28gYmUgcmV0cmlldmVkIHRocm91Z2ggYSBjYWxsIHRvDQogICAgQUNFX2dldF9jaGFubmVsX2hhbmRsZSgpIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGNoYW5uZWwgaXMga25vd24sIG9yIGJ5DQogICAgaXRlcmF0aW5nIHRob3VnaCBhbGwgYW5hbG9nIGlucHV0IGNoYW5uZWwgdXNpbmcgdGhlIEFDRV9nZXRfZmlyc3RfY2hhbm5lbCgpDQogICAgYW5kIEFDRV9nZXRfbmV4dF9jaGFubmVsKCkuDQoNCiAgQHBhcmFtIHRlbXBlcmF0dXJlDQogICAgVGhlIHRlbXBlcmF0dXJlIHBhcmFtZXRlciBpcyB0aGUgZGVncmVlcyBGYWhyZW5oZWl0IHRlbXBlcmF0dXJlIHZhbHVlIGZvcg0KICAgIHdoaWNoIHdlIHdhbnQgdGhpcyBmdW5jdGlvbiB0byByZXR1cm4gdGhlIGFzc29jaWF0ZWQgUFBFIHNhbXBsZSByZXN1bHQgdmFsdWUuDQoNCiAgQHJldHVybg0KICAgIFRoZSBBQ0VfY29udmVydF9mcm9tX0ZhaHJlbmhlaXQoKSByZXR1cm5zIHRoZSBQUEUgc2FtcGxlIHZhbHVlIHRoYXQgd291bGQgYmUNCiAgICBwcm9kdWNlZCBpZiB0aGUgYW5hbG9nIGlucHV0IGNoYW5uZWwgaWRlbnRpZmllZCBieSBjaGFubmVsX2hhbmRsZSB3YXMgc2V0IHRvDQogICAgdGhlIHRlbXBlcmF0dXJlIHZhbHVlIHBhc3NlZCBhcyBzZWNvbmQgcGFyYW1ldGVyLg0KICovDQp1aW50MTZfdCBBQ0VfY29udmVydF9mcm9tX0ZhaHJlbmhlaXQNCigNCiAgICBhY2VfY2hhbm5lbF9oYW5kbGVfdCAgICBjaGFubmVsX2hhbmRsZSwNCiAgICBpbnQzMl90ICAgICAgICAgICAgICAgICB0ZW1wZXJhdHVyZQ0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV90cmFuc2xhdGVfcGRtYV92YWx1ZSgpIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgUERNQSBzYW1wbGluZyB2YWx1ZXMsDQogIHJlY2VpdmVkIGZyb20gdGhlIEFDRSB2aWEgUERNQSB0cmFuc2ZlcnMsIGludG8gaW5wdXQgY2hhbm5lbCBJRCBhbmQgUFBFDQogIHNhbXBsZSB2YWx1ZS4NCiAgVGhlIFBETUEgc2FtcGxpbmcgdmFsdWVzIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIEFDRSBhcyBhIHJlc3VsdCBvZiBzZWxlY3RpbmcNCiAgIlNlbmQgcmVzdWx0IHRvIERNQSIgaW4gdGhlIEFDRSBjb25maWd1cmF0b3IgYW5hbG9nIGlucHV0IGNvbmZpZ3VyYXRpb24uIFRoZQ0KICBQRE1BIHNhbXBsaW5nIHZhbHVlcyBjYW4gYmUgZWl0aGVyIHJhdyBBREMgdmFsdWVzLCBmaWx0ZXJlZCB2YWx1ZXMgb3IgdGhlDQogIHJlc3VsdCBvZiBhIGxpbmVhciB0cmFuc2Zvcm1hdGlvbi4NCiAgVGhlIFBETUEgc2FtcGxpbmcgdmFsdWVzIGFyZSBvYnRhaW5lZCBieSBjb25maWd1cmluZyB0aGUgUERNQSBjb250cm9sbGVyIHRvDQogIHRyYW5zZmVyIGRhdGEgZnJvbSB0aGUgQUNFIGludG8gYSBtZW1vcnkgYnVmZmVyLiBUaGUgQUNFX3RyYW5zbGF0ZV9wZG1hX3ZhbHVlKCkNCiAgZnVuY3Rpb24gaXMgdXNlZCB0byBpbnRlcnByZXQgdGhlIGNvbnRlbnQgb2YgdGhhdCBtZW1vcnkgYnVmZmVyLg0KDQogIFBsZWFzZSBub3RlIHRoYXQgdGhlIHRyYW5zbGF0aW9uIG9mIFBETUEgZGF0YSBjb250YWluaW5nIHJhdyBBREMgdmFsdWVzIGZyb20NCiAgQUJQUyBpbnB1dHMgd2lsbCByZXN1bHQgaW4gc2FtcGxlIHZhbHVlcyB3aXRoIGFuIHVuZXhwZWN0ZWQgcG9sYXJpdHkuDQogIFRoZSByZXR1cm5lZCBzYW1wbGUgdmFsdWUgd2lsbCBoYXZlIHRoZSBvcHBvc2l0ZSBwb2xhcml0eSB0byB0aGUgYWN0dWFsIGFuYWxvZw0KICB2YWx1ZSBzZWVuIG9uIHRoZSBBQlBTIGlucHV0LiBUaGlzIGlzIGR1ZSB0byB0aGUgaW50ZXJuYWwgY2hhcmFjdGVyaXN0aWNzIG9mDQogIHRoZSBhbmFsb2cgZnJvbnQgZW5kIHRoYXQgYXJlIG5vcm1hbGx5IGhpZGRlbiBieSB0aGUgUFBFIHByb2Nlc3Npbmcgb2YgQURDIHJhdw0KICBzYW1wbGVzLiBUaGUgdHJhbnNsYXRpb24gb2YgcmF3IEFEQyB2YWx1ZXMgZnJvbSBhbmFsb2cgaW5wdXRzIG90aGVyIHRoYW4gQUJQUw0KICBpbnB1dHMgd2lsbCByZXN1bHQgaW4gY29ycmVjdCBzYW1wbGUgdmFsdWVzLg0KDQogICBAcGFyYW0gcGRtYV92YWx1ZQ0KICAgIFRoZSBwZG1hX3ZhbHVlIHBhcmFtZXRlciBpcyBhIDMyLWJpdCB2YWx1ZSByZWNlaXZlZCBmcm9tIHRoZSBBQ0UgdGhyb3VnaCBhDQogICAgcGVyaXBoZXJhbCBETUEgdHJhbnNmZXIuDQoNCiAgQHBhcmFtIGNoYW5uZWxfaWQNCiAgICBUaGUgY2hhbm5lbF9pZCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIEFEQyBjaGFubmVsIElEIHZhcmlhYmxlLiBJdCBpcw0KICAgIHVzZWQgdG8gcmV0dXJuIHRoZSBJRCBvZiB0aGUgQURDIGNoYW5uZWwgZnJvbSB3aGljaCB0aGUgUFBFIHNhbXBsZSB2YWx1ZQ0KICAgIHdhcyBnZW5lcmF0ZWQgZnJvbS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byB6ZXJvIGlmIHJldHJpZXZpbmcgdGhlDQogICAgY2hhbm5lbCBJRCBpcyBub3QgcmVxdWlyZWQuDQoNCiAgQHJldHVybg0KICAgIFRoZSBBQ0VfdHJhbnNsYXRlX3BkbWFfdmFsdWUoKSByZXR1cm5zIHRoZSBQUEUgc2FtcGxlIHZhbHVlIGV4dHJhY3RlZCBmcm9tDQogICAgdGhlIFBETUEgc2FtcGxpbmcgdmFsdWUuDQoNCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICB1aW50MTZfdCBwcGVfdmFsdWU7DQogICAgdWludDE2X3QgcGRtYV92YWx1ZTsNCiAgICBhZGNfY2hhbm5lbF9pZF90IGNoYW5uZWxfaWQ7DQogICAgYWNlX2NoYW5uZWxfaGFuZGxlX3QgY2hhbm5lbF9oYW5kbGU7DQoNCiAgICBwZG1hX3ZhbHVlID0gZ2V0X25leHRfcGRtYV9hY2Vfc2FtcGxlKCk7DQogICAgcHBlX3ZhbHVlID0gQUNFX3RyYW5zbGF0ZV9wZG1hX3ZhbHVlKHBkbWFfdmFsdWUsICZjaGFubmVsX2lkKTsNCiAgICBjaGFubmVsX2hhbmRsZSA9IEFDRV9nZXRfaW5wdXRfY2hhbm5lbF9oYW5kbGUoY2hhbm5lbF9pZCk7DQogICAgaWYgKGNoYW5uZWxfaGFuZGxlICE9IElOVkFMSURfQ0hBTk5FTF9IQU5ETEUpDQogICAgew0KICAgICAgICBkaXNwbGF5X3ZhbHVlKGNoYW5uZWxfaGFuZGxlLCBwcGVfdmFsdWUpOw0KICAgIH0NCiAgQGVuZGNvZGUNCg0KICovDQp1aW50MTZfdCBBQ0VfdHJhbnNsYXRlX3BkbWFfdmFsdWUNCigNCiAgICB1aW50MzJfdCAgICAgICAgICAgIHBkbWFfdmFsdWUsDQogICAgYWRjX2NoYW5uZWxfaWRfdCAqICBjaGFubmVsX2lkDQopOw0KDQovKiogQH0gKi8NCg0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8vKioNCiAgQGRlZmdyb3VwIGdyb3VwMTIgRHluYW1pYyBMaW5lYXIgVHJhbnNmb3JtIENvbnRyb2wgRnVuY3Rpb25zDQogIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGR5bmFtaWNhbGx5IGFkanVzdCB0aGUgbGluZWFyIHRyYW5zZm9ybQ0KICBhcHBsaWVkIHRvIGFuYWxvZyBpbnB1dCBzYW1wbGVzIGJ5IHRoZSBwb3N0IHByb2Nlc3NpbmcgZW5naW5lOg0KICAgIC0gQUNFX2dldF9kZWZhdWx0X21fZmFjdG9yKCkNCiAgICAtIEFDRV9nZXRfZGVmYXVsdF9jX29mZnNldCgpDQogICAgLSBBQ0Vfc2V0X2xpbmVhcl90cmFuc2Zvcm0oKQ0KICBUaGUgcG9zdCBwcm9jZXNzaW5nIGVuZ2luZSBwZXJmb3JtcyBhIGxpbmVhciB0cmFuc2Zvcm0gb24gYW5hbG9nIGlucHV0IHNhbXBsZXMNCiAgb2J0YWluZWQgZnJvbSB0aGUgc2FtcGxlIHNlcXVlbmNpbmcgZW5naW5lLiBUaGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMgbGluZWFyDQogIHRyYW5zZm9ybSBpcyB0byBhcHBseSBwYXJ0IHNwZWNpZmljIGZhY3RvcnkgY2FsaWJyYXRpb24gdG8gdGhlIGFuYWxvZyBzYW1wbGVzDQogIGluIG9yZGVyIHRvIGFjaGlldmUgaGlnaCBhY2N1cmFjeS4gQSBzZWNvbmQgdXNlciBzcGVjaWZpZWQgbGluZWFyIHRyYW5zZm9ybQ0KICBjYW4gYWxzbyBiZSBvcHRpb25hbGx5IGFwcGxpZWQgdG8gdGhlIGFuYWxvZyBzYW1wbGVzLiBUaGlzIHNlY29uZCBsaW5lYXINCiAgdHJhbnNmb3JtIGNhbiBiZSB1c2VkIHRvIGFkanVzdCBmb3IgYm9hcmQgbGV2ZWwgY2FsaWJyYXRpb24gb3IgYXBwbGljYXRpb24NCiAgc3BlY2lmaWMgdHVuaW5nLiBUaGUgZnVuY3Rpb25zIGRlc2NyaWJlZCBpbiB0aGlzIHNlY3Rpb24gYXBwbHkgdG8gdGhlIHVzZXINCiAgZGVmaW5lZCB0cmFuc2Zvcm0uIEZhY3RvcnkgY2FsaWJyYXRpb24gd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgdGhlIHVzZSBvZiB0aGUNCiAgQUNFX3NldF9saW5lYXJfdHJhbnNmb3JtKCkgZnVuY3Rpb24uDQogIE5vdGU6DQogICAgVGhlIHBvc3QgcHJvY2Vzc2luZyBlbmdpbmUgYWN0dWFsbHkgb25seSBwZXJmb3JtcyBvbmUgc2luZ2xlIGxpbmVhcg0KICAgIHRyYW5zZm9ybSBvbiBhbmFsb2cgc2FtcGxlcy4gVGhpcyB0cmFuc2Zvcm0gdGFrZXMgaW50byBhY2NvdW50IGZhY3RvcnkNCiAgICBjYWxpYnJhdGlvbiBhbmQgdGhlIHVzZXIgZGVmaW5lZCB0cmFuc2Zvcm0uIFRoZSBhcHBsaWVkIHkgPSBtLnggKyBjDQogICAgdHJhbnNmb3JtIHVzZXMgYW4gbSBmYWN0b3IgZXF1YWwgdG8gbTEubTIubWV4dCBhbmQgYyBvZmZzZXQgZXF1YWwgdG8NCiAgICAobTIuYzEubWV4dCkgKyAoYzIubWV4dCkgd2hlcmUgbTEgYW5kIGMxIGFyZSB0aGUgZmFjdG9yeSBjYWxpYnJhdGlvbiBmYWN0b3INCiAgICBhbmQgb2Zmc2V0OyBtMiBhbmQgYzIgYXJlIHRoZSB1c2VyIGRlZmluZWQgdHJhbnNmb3JtIGZhY3RvciBhbmQgb2Zmc2V0OyBhbmQNCiAgICBtZXh0IGlzIGEgZmFjdG9yeSBjYWxpYnJhdGlvbiBmYWN0b3IgZGVwZW5kaW5nIG9uIHRoZSByZWZlcmVuY2Ugdm9sdGFnZQ0KICAgIHVzZWQgYnkgdGhlIEFEQyBnZW5lcmF0aW5nIHRoZSBzYW1wbGUuDQogIEB7DQogKi8vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV9nZXRfZGVmYXVsdF9tX2ZhY3RvcigpIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbQ0KICBmYWN0b3Igb2YgdGhlIHVzZXIgZGVmaW5lZCBsaW5lYXIgdHJhbnNmb3JtIGFwcGxpZWQgYnkgdGhlIHBvc3QgcHJvY2Vzc2luZw0KICBlbmdpbmUgdG8gYW5hbG9nIHNhbXBsZXMuIFRoZSB1c2VyIGRlZmluZWQgbGluZWFyIHRyYW5zZm9ybSBtIGZhY3RvciBkZWZhdWx0DQogIHZhbHVlIGlzIHNlbGVjdGVkIGluIHRoZSBBQ0UgY29uZmlndXJhdG9yIHRvb2wuDQoNCiAgQHBhcmFtIGNoYW5uZWxfaGFuZGxlDQogICAgVGhlIGNoYW5uZWxfaGFuZGxlIHBhcmFtZXRlciBpZGVudGlmaWVzIG9uZSBvZiB0aGUgYW5hbG9nIGlucHV0IGNoYW5uZWxzDQogICAgbW9uaXRvcmVkIGJ5IHRoZSBBQ0UuIFRoZSBhdmFpbGFibGUgY2hhbm5lbCBoYW5kbGUgdmFsdWVzIGNhbiBiZSBmb3VuZCBpbg0KICAgIHRoZSBhY2VfaGFuZGxlcy5oIGZpbGUgbG9jYXRlZCBpbiB0aGUgLlxkcml2ZXJzX2NvbmZpZ1xtc3NfYWNlDQogICAgc3ViZGlyZWN0b3J5LiBUaGUgY2hhbm5lbCBoYW5kbGUgdmFsdWUgY2FuIGFsc28gYmUgcmV0cmlldmVkIHRocm91Z2ggYSBjYWxsDQogICAgdG8gQUNFX2dldF9jaGFubmVsX2hhbmRsZSgpIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGNoYW5uZWwgaXMga25vd24sIG9yIGJ5DQogICAgaXRlcmF0aW5nIHRob3VnaCBhbGwgYW5hbG9nIGlucHV0IGNoYW5uZWwgdXNpbmcgdGhlIEFDRV9nZXRfZmlyc3RfY2hhbm5lbCgpDQogICAgYW5kIEFDRV9nZXRfbmV4dF9jaGFubmVsKCkuDQoNCiAgQHJldHVybg0KICAgIFRoZSBBQ0VfZ2V0X2RlZmF1bHRfbV9mYWN0b3IoKSBmdW5jdGlvbiByZXR1cm5zIHRoZSB1c2VyIHRyYW5zZm9ybSBtIGZhY3Rvcg0KICAgIGRlZmF1bHQgdmFsdWUuIEl0IGlzIGEgc2lnbmVkIDE2LWJpdCBudW1iZXIgcmVwcmVzZW50aW5nIGEgZmFjdG9yIGluIHRoZQ0KICAgIHJhbmdlIC0yIHRvICsxLjk5OTkzODk2NDg0Mzc1LiBUaGUgdmFsdWUgb2YgdGhlIG0gZmFjdG9yIGlzIG9idGFpbmVkIGJ5DQogICAgbXVsdGlwbHlpbmcgdGhlIHJldHVybiB2YWx1ZZJzIGFic29sdXRlIHZhbHVlIGJ5IDItMTQuDQogKi8NCmludDE2X3QgQUNFX2dldF9kZWZhdWx0X21fZmFjdG9yDQooDQogICAgYWNlX2NoYW5uZWxfaGFuZGxlX3QgY2hhbm5lbF9oYW5kbGUNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV9nZXRfZGVmYXVsdF9jX29mZnNldCgpIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYw0KICBvZmZzZXQgb2YgdGhlIHVzZXIgZGVmaW5lZCBsaW5lYXIgdHJhbnNmb3JtIGFwcGxpZWQgYnkgdGhlIHBvc3QgcHJvY2Vzc2luZw0KICBlbmdpbmUgdG8gYW5hbG9nIHNhbXBsZXMuIFRoZSB1c2VyIGRlZmluZWQgbGluZWFyIHRyYW5zZm9ybSBjIG9mZnNldCBkZWZhdWx0DQogIHZhbHVlIGlzIHNlbGVjdGVkIGluIHRoZSBBQ0UgY29uZmlndXJhdG9yIHRvb2wuDQoNCiAgQHBhcmFtIGNoYW5uZWxfaGFuZGxlDQogICAgVGhlIGNoYW5uZWxfaGFuZGxlIHBhcmFtZXRlciBpZGVudGlmaWVzIG9uZSBvZiB0aGUgYW5hbG9nIGlucHV0IGNoYW5uZWxzDQogICAgbW9uaXRvcmVkIGJ5IHRoZSBBQ0UuIFRoZSBhdmFpbGFibGUgY2hhbm5lbCBoYW5kbGUgdmFsdWVzIGNhbiBiZSBmb3VuZCBpbg0KICAgIHRoZSBhY2VfaGFuZGxlcy5oIGZpbGUgbG9jYXRlZCBpbiB0aGUgLlxkcml2ZXJzX2NvbmZpZ1xtc3NfYWNlDQogICAgc3ViZGlyZWN0b3J5LiBUaGUgY2hhbm5lbCBoYW5kbGUgdmFsdWUgY2FuIGFsc28gYmUgcmV0cmlldmVkIHRocm91Z2ggYSBjYWxsDQogICAgdG8gQUNFX2dldF9jaGFubmVsX2hhbmRsZSgpIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGNoYW5uZWwgaXMga25vd24sIG9yIGJ5DQogICAgaXRlcmF0aW5nIHRob3VnaCBhbGwgYW5hbG9nIGlucHV0IGNoYW5uZWwgdXNpbmcgdGhlIEFDRV9nZXRfZmlyc3RfY2hhbm5lbCgpDQogICAgYW5kIEFDRV9nZXRfbmV4dF9jaGFubmVsKCkuDQoNCiAgQHJldHVybg0KICAgIFRoZSBBQ0VfZ2V0X2RlZmF1bHRfY19vZmZzZXQoKSBmdW5jdGlvbiByZXR1cm5zIHRoZSB1c2VyIGxpbmVhciB0cmFuc2Zvcm2Scw0KICAgIGMgb2Zmc2V0IGRlZmF1bHQgdmFsdWUuIEl0IGlzIGEgc2lnbmVkIDE2LWJpdCBudW1iZXIgcmVwcmVzZW50aW5nIGEgZmFjdG9yDQogICAgaW4gdGhlIHJhbmdlIC0yIHRvICsxLjk5OTkzODk2NDg0Mzc1LiBUaGUgdmFsdWUgb2YgdGhlIGMgb2Zmc2V0IGlzIG9idGFpbmVkDQogICAgYnkgbXVsdGlwbHlpbmcgdGhlIHJldHVybiB2YWx1ZZJzIGFic29sdXRlIHZhbHVlIGJ5IDItMTQuDQogKi8NCmludDE2X3QgQUNFX2dldF9kZWZhdWx0X2Nfb2Zmc2V0DQooDQogICAgYWNlX2NoYW5uZWxfaGFuZGxlX3QgY2hhbm5lbF9oYW5kbGUNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIEFDRV9zZXRfbGluZWFyX3RyYW5zZm9ybSgpIGZ1bmN0aW9uIGFsbG93cyBhZGp1c3RpbmcgdGhlIHVzZXIgZGVmaW5lZA0KICBsaW5lYXIgdHJhbnNmb3JtIGFwcGxpZWQgdG8gYW5hbG9nIGlucHV0IHNhbXBsZXMgYnkgdGhlIHBvc3QgcHJvY2Vzc2luZw0KICBlbmdpbmUuIFRoZSBsaW5lYXIgdHJhbnNmb3JtIGlzIG9mIHRoZSBmb3JtIHkgPSBtLnggKyBiIHdoZXJlIHRoZSBtIGZhY3Rvcg0KICBhbmQgYyBvZmZzZXQgYXJlIGluIHRoZSByYW5nZSAtMiB0byArMS45OTk5Mzg5NjQ4NDM3NS4NCg0KICBAcGFyYW0gY2hhbm5lbF9oYW5kbGUNCiAgICBUaGUgY2hhbm5lbF9oYW5kbGUgcGFyYW1ldGVyIGlkZW50aWZpZXMgb25lIG9mIHRoZSBhbmFsb2cgaW5wdXQgY2hhbm5lbHMNCiAgICBtb25pdG9yZWQgYnkgdGhlIEFDRS4gVGhlIGF2YWlsYWJsZSBjaGFubmVsIGhhbmRsZSB2YWx1ZXMgY2FuIGJlIGZvdW5kIGluDQogICAgdGhlIGFjZV9oYW5kbGVzLmggZmlsZSBsb2NhdGVkIGluIHRoZSAuXGRyaXZlcnNfY29uZmlnXG1zc19hY2UNCiAgICBzdWJkaXJlY3RvcnkuIFRoZSBjaGFubmVsIGhhbmRsZSB2YWx1ZSBjYW4gYWxzbyBiZSByZXRyaWV2ZWQgdGhyb3VnaCBhIGNhbGwNCiAgICB0byBBQ0VfZ2V0X2NoYW5uZWxfaGFuZGxlKCkgd2hlbiB0aGUgbmFtZSBvZiB0aGUgY2hhbm5lbCBpcyBrbm93biwgb3IgYnkNCiAgICBpdGVyYXRpbmcgdGhvdWdoIGFsbCBhbmFsb2cgaW5wdXQgY2hhbm5lbCB1c2luZyB0aGUgQUNFX2dldF9maXJzdF9jaGFubmVsKCkNCiAgICBhbmQgQUNFX2dldF9uZXh0X2NoYW5uZWwoKS4NCg0KICBAcGFyYW0gbTINCiAgICBUaGUgbTIgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgdXNlciBkZWZpbmVkIHRyYW5zZm9ybZJzIG0gZmFjdG9yLiBJdCBpcyBhDQogICAgc2lnbmVkIDE2LWJpdCBudW1iZXIgcmVwcmVzZW50aW5nIGEgZmFjdG9yIGluIHRoZSByYW5nZSAtMiB0bw0KICAgICsxLjk5OTkzODk2NDg0Mzc1LiBUaGUgdmFsdWUgb2YgdGhlIG0yIGZhY3RvciBpcyBvYnRhaW5lZCBieSBtdWx0aXBseWluZyB0aGUNCiAgICBwYXJhbWV0ZXKScyBhYnNvbHV0ZSB2YWx1ZSBieSAyXi0xNC4gRm9yIGV4YW1wbGUsIGEgdmFsdWUgb2YgMHg3MDAwDQogICAgcmVwcmVzZW50cyBhIDEuNzUgZmFjdG9yIGFuZCBhIHZhbHVlIG9mIDB4RTAwMCByZXByZXNlbnRzIGEgLTAuNSBmYWN0b3IuDQoNCiAgQHBhcmFtIGMyDQogICAgVGhlIGMyIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHVzZXIgZGVmaW5lZCB0cmFuc2Zvcm2ScyBjIG9mZnNldC4gSXQgaXMgYQ0KICAgIHNpZ25lZCAxNi1iaXQgbnVtYmVyIHJlcHJlc2VudGluZyBhbiBvZmZzZXQgaW4gdGhlIHJhbmdlIC0yIHRvDQogICAgKzEuOTk5OTM4OTY0ODQzNzUuIFRoZSB2YWx1ZSBvZiB0aGUgYzIgb2Zmc2V0IGlzIG9idGFpbmVkIGJ5IG11bHRpcGx5aW5nIHRoZQ0KICAgIHBhcmFtZXRlcpJzIGFic29sdXRlIHZhbHVlIGJ5IDJeLTE0LiBGb3IgZXhhbXBsZSwgYSB2YWx1ZSBvZiAweDEwMDAgcmVwcmVzZW50cw0KICAgIGEgMC4yNSBvZmZzZXQgYW5kIGEgdmFsdWUgb2YgMHhCMDAwIHJlcHJlc2VudHMgYSAtMS4yNSBvZmZzZXQuDQoNCiAgQGNvZGUNCiAgICB2b2lkIHJlc2V0X3RvX2RlZmF1bHQoYWNlX2NoYW5uZWxfaGFuZGxlX3QgY2hhbm5lbF9oYW5kbGUpDQogICAgew0KICAgICAgICBpbnQxNl90IG07DQogICAgICAgIGludDE2X3QgYzsNCg0KICAgICAgICBtID0gQUNFX2dldF9kZWZhdWx0X21fZmFjdG9yKGNoYW5uZWxfaGFuZGxlKTsNCiAgICAgICAgYyA9IEFDRV9nZXRfZGVmYXVsdF9jX29mZnNldChjaGFubmVsX2hhbmRsZSk7DQogICAgICAgIEFDRV9zZXRfbGluZWFyX3RyYW5zZm9ybShjaGFubmVsX2hhbmRsZSwgbSwgYyk7DQogICAgfQ0KICBAZW5kY29kZQ0KICovDQp2b2lkIEFDRV9zZXRfbGluZWFyX3RyYW5zZm9ybQ0KKA0KICAgIGFjZV9jaGFubmVsX2hhbmRsZV90IGNoYW5uZWxfaGFuZGxlLA0KCWludDE2X3QgbTIsDQoJaW50MTZfdCBjMg0KKTsNCg0KLyoqIEB9ICovDQoNCiNpZmRlZiBfX2NwbHVzcGx1cw0KfQ0KI2VuZGlmDQoNCiNlbmRpZgkvKiBfX01TU19BQ0VfSF8gKi8NCg==