PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCQkJUkVBRE1FIGZvciBVU0I4Mzg4CgogKGMpIENvcHlyaWdodCCpIDIwMDMtMjAwNiwgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4KIEFsbCBSaWdodHMgUmVzZXJ2ZWQKCiBUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgSW50ZXJuYXRpb25hbAogTHRkLiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxCiAodGhlICJMaWNlbnNlIikuICBZb3UgbWF5IHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcyBGaWxlIGluCiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBMaWNlbnNlLCBhIGNvcHkgb2Ygd2hpY2gKIGlzIGF2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8KIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCiAwMjExMS0xMzA3IG9yIG9uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKIFRIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFCiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCiBBUkUgRVhQUkVTU0xZIERJU0NMQUlNRUQuICBUaGUgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQKIHRoaXMgd2FycmFudHkgZGlzY2xhaW1lci4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCj09PT09PT09PT09PT09PT09PT09PQpEUklWRVIgTE9BRElORwo9PT09PT09PT09PT09PT09PT09PT0KCglvLiBDb3B5IHRoZSBmaXJtd2FyZSBpbWFnZSAoZS5nLiB1c2I4Mzg4LmJpbikgdG8gL2xpYi9maXJtd2FyZS8KCglvLiBMb2FkIGRyaXZlciBieSB1c2luZyB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CgoJCWluc21vZCB1c2I4Mzg4LmtvIFtmd19uYW1lPXVzYjgzODguYmluXQoKPT09PT09PT09PT09PT09PT09PT09CklXUFJJViBDT01NQU5ECj09PT09PT09PT09PT09PT09PT09PQoKTkFNRQoJVGhpcyBtYW51YWwgZGVzY3JpYmVzIHRoZSB1c2FnZSBvZiBwcml2YXRlIGNvbW1hbmRzIHVzZWQgaW4gTWFydmVsbCBXTEFOCglMaW51eCBEcml2ZXIuIEFsbCB0aGUgY29tbWFuZHMgYXZhaWxhYmxlIGluIFdsYW5jb25maWcgd2lsbCBub3QgYmUgYXZhaWxhYmxlCglpbiB0aGUgaXdwcml2LgoKU1lOT1BTSVMKCWl3cHJpdiA8ZXRoWD4gPGNvbW1hbmQ+IFtzdWItY29tbWFuZF0gLi4uCgoJaXdwcml2IGV0aFggdmVyc2lvbgoJaXdwcml2IGV0aFggc2NhbnR5cGUgW3N1Yi1jb21tYW5kXQoJaXdwcml2IGV0aFggZ2V0U05SIDxuPgoJaXdwcml2IGV0aFggZ2V0TkYgPG4+Cglpd3ByaXYgZXRoWCBnZXRSU1NJIDxuPgoJaXdwcml2IGV0aFggc2V0cnhhbnQgPG4+Cglpd3ByaXYgZXRoWCBnZXRyeGFudAoJaXdwcml2IGV0aFggc2V0dHhhbnQgPG4+Cglpd3ByaXYgZXRoWCBnZXR0eGFudAoJaXdwcml2IGV0aFggYXV0aGFsZ3MgPG4+Cglpd3ByaXYgZXRoWCBwcmUtVEJUVCA8bj4KCWl3cHJpdiBldGhYIDgwMjF4YXV0aGFsZ3MgPG4+Cglpd3ByaXYgZXRoWCBlbmNyeXB0aW9ubW9kZSA8bj4KCWl3cHJpdiBldGhYIHNldHJlZ2lvbmNvZGUgPG4+Cglpd3ByaXYgZXRoWCBnZXRyZWdpb25jb2RlCglpd3ByaXYgZXRoWCBzZXRiY25hdmcgPG4+Cglpd3ByaXYgZXRoWCBnZXRiY25hdmcKCWl3cHJpdiBldGhYIHNldGRhdGFhdmcgPG4+Cglpd3ByaXYgZXRoWCBzZXRsaXN0ZW5pbnRlciA8bj4KCWl3cHJpdiBldGhYIGdldGxpc3RlbmludGVyCglpd3ByaXYgZXRoWCBzZXRtdWx0aXBsZWR0aW0gPG4+Cglpd3ByaXYgZXRoWCBnZXRtdWx0aXBsZWR0aW0KCWl3cHJpdiBldGhYIGF0aW13aW5kb3cgPG4+Cglpd3ByaXYgZXRoWCBkZWF1dGgKCWl3cHJpdiBldGhYIGFkaG9jc3RvcAoJaXdwcml2IGV0aFggcmFkaW9vbgoJaXdwcml2IGV0aFggcmFkaW9vZmYKCWl3cHJpdiBldGhYIHJlYXNzby1vbgoJaXdwcml2IGV0aFggcmVhc3NvLW9mZgoJaXdwcml2IGV0aFggc2Nhbm1vZGUgIFtzdWItY29tbWFuZF0KCWl3cHJpdiBldGhYIHNldHdwYWllIDxuPgoJaXdwcml2IGV0aFggd2xhbmlkbGUtb2ZmCglpd3ByaXYgZXRoWCB3bGFuaWRsZS1vbgoJaXdwcml2IGV0aFggZ2V0Y2lzCglpd3ByaXYgZXRoWCBnZXRsb2cKCWl3cHJpdiBldGhYIGdldGFkaG9jc3RhdHVzCglpd3ByaXYgZXRoWCBhZGhvY2dyYXRlIDxuPgoKVmVyc2lvbiA0IENvbW1hbmQ6Cglpd3ByaXYgZXRoWCBpbmFjdHZpdHl0byA8bj4KCWl3cHJpdiBldGhYIHNsZWVwcGQgPG4+Cglpd3ByaXYgZXRoWCBlbmFibGUxMWQgPG4+Cglpd3ByaXYgZXRoWCB0cGNjZmcgPG4+Cglpd3ByaXYgZXRoWCBwb3dlcmNmZyA8bj4KCWl3cHJpdiBldGhYIHNldGFmYyA8bj4KCWl3cHJpdiBldGhYIGdldGFmYwoKVmVyc2lvbiA1IENvbW1hbmQ6Cglpd3ByaXYgZXRoWCBsZWRncGlvIDxuPgoJaXdwcml2IGV0aFggc2NhbnByb2JlcyA8bj4KCWl3cHJpdiBldGhYIGxvbGlzdGVuaW50ZXIgPG4+Cglpd3ByaXYgZXRoWCByYXRlYWRhcHQgPG4+IDxtPgoJaXdwcml2IGV0aFggdHhjb250cm9sIDxuPgoJaXdwcml2IGV0aFggcHNudWxsaW50ZXJ2YWwgPG4+Cglpd3ByaXYgZXRoWCBwcmVzY2FuIDxuPgoJaXdwcml2IGV0aFggZ2V0cnhpbmZvCglpd3ByaXYgZXRoWCBnZXR0eHJhdGUKCWl3cHJpdiBldGhYIGJlYWNvbmludGVydmFsCgpCVCBDb21tYW5kczoKCVRoZSBibGluZGluZyB0YWJsZSAoQlQpIGNvbnRhaW5zIGEgbGlzdCBvZiBtYWMgYWRkcmVzc2VzIHRoYXQgc2hvdWxkIGJlCglpZ25vcmVkIGJ5IHRoZSBmaXJtd2FyZS4gIEl0IGlzIHByaW1hcmlseSB1c2VkIGZvciBkZWJ1Z2dpbmcgYW5kCgl0ZXN0aW5nIG5ldHdvcmtzLiAgSXQgY2FuIGJlIGVkaXRlZCBhbmQgaW5zcGVjdGVkIHdpdGggdGhlIGZvbGxvd2luZwoJY29tbWFuZHM6CgoJaXdwcml2IGV0aFggYnRfcmVzZXQKCWl3cHJpdiBldGhYIGJ0X2FkZCA8bWFjX2FkZHJlc3M+Cglpd3ByaXYgZXRoWCBidF9kZWwgPG1hY19hZGRyZXNzPgoJaXdwcml2IGV0aFggYnRfbGlzdCA8aWQ+CgpGV1QgQ29tbWFuZHM6CglUaGUgZm9yd2FyZGluZyB0YWJsZSAoRldUKSBpcyBhIGZlYXR1cmUgdXNlZCB0byBtYW5hZ2UgbWVzaCBuZXR3b3JrCglyb3V0aW5nIGluIHRoZSBmaXJtd2FyZS4gIFRoZSBGV1QgaXMgZXNzZW50aWFsbHkgYSByb3V0aW5nIHRhYmxlIHRoYXQKCWFzc29jaWF0ZXMgYSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyAoZGEpIHdpdGggYSBuZXh0IGhvcCByZWNlaXZlcgoJYWRkcmVzcyAocmEpLiAgVGhlIEZXVCBjYW4gYmUgaW5zcGVjdGVkIGFuZCBlZGl0ZWQgd2l0aCB0aGUgZm9sbG93aW5nCglpd3ByaXYgY29tbWFuZHMsIHdoaWNoIGFyZSBkZXNjcmliZWQgaW4gZ3JlYXRlciBkZXRhaWwgYmVsb3cuCglFdmVudHVhbGx5LCB0aGUgdGFibGUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IG1haW50YWluZWQgYnkgYSBjdXN0b20KCXJvdXRpbmcgcHJvdG9jb2wuCgoJTk9URTogRldUIGNvbW1hbmRzIHJlcGxhY2UgdGhlIHByZXZpb3VzIERGVCBjb21tYW5kcy4gIFdoYXQgd2VyZSB0aGUgREZUCgljb21tYW5kcz8sIHlvdSBtaWdodCBhc2suICBUaGV5IHdlcmUgYW4gZWFybGllciBBUEkgdG8gdGhlIGZpcm13YXJlIHRoYXQKCWltcGxlbWVudGVkIGEgc2ltcGxlIE1BQy1sYXllciBmb3J3YXJkaW5nIG1lY2hhbmlzbS4gIEluIHRoZSB1bmxpa2VseQoJZXZlbnQgdGhhdCB5b3Ugd2VyZSB1c2luZyB0aGVzZSBjb21tYW5kcywgeW91IG11c3QgbWlncmF0ZSB0byB0aGUgbmV3CglGV1QgY29tbWFuZHMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYWNoaWV2ZSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5LgoKCWl3cHJpdiBldGhYIGZ3dF9hZGQgW3BhcmFtZXRlcnNdCglpd3ByaXYgZXRoWCBmd3RfZGVsIFtwYXJhbWV0ZXJzXQoJaXdwcml2IGV0aFggZnd0X2xvb2t1cCBbcGFyYW1ldGVyc10KCWl3cHJpdiBldGhYIGZ3dF9saXN0IFtwYXJhbWV0ZXJzXQoJaXdwcml2IGV0aFggZnd0X2xpc3Rfcm91dGUgW3BhcmFtZXRlcnNdCglpd3ByaXYgZXRoWCBmd3RfbGlzdF9uZWlnaCBbcGFyYW1ldGVyc10KCWl3cHJpdiBldGhYIGZ3dF9yZXNldCBbcGFyYW1ldGVyc10KCWl3cHJpdiBldGhYIGZ3dF9jbGVhbnVwCglpd3ByaXYgZXRoWCBmd3RfdGltZQoKTUVTSCBDb21tYW5kczoKCglUaGUgTUVTSCBjb21tYW5kcyBhcmUgdXNlZCB0byBjb25maWd1cmUgdmFyaW91cyBmZWF0dXJlcyBvZiB0aGUgbWVzaAoJcm91dGluZyBwcm90b2NvbC4gIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIHN1cHBvcnRlZDoKCglpd3ByaXYgZXRoWCBtZXNoX2dldF90dGwKCWl3cHJpdiBldGhYIG1lc2hfc2V0X3R0bCB0dGwKCkRFU0NSSVBUSU9OCglUaG9zZSBjb21tYW5kcyBhcmUgdXNlZCB0byBzZW5kIGFkZGl0aW9uYWwgY29tbWFuZHMgdG8gdGhlIE1hcnZlbGwgV0xBTgoJY2FyZCB2aWEgdGhlIExpbnV4IGRldmljZSBkcml2ZXIuCgoJVGhlIGV0aFggcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbmV0d29yayBkZXZpY2UgdGhhdCBpcyB0byBiZSB1c2VkIHRvCgkJcGVyZm9ybSB0aGlzIGNvbW1hbmQgb24uIGl0IGNvdWxkIGJlIGV0aDAsIGV0aDEgZXRjLgoKdmVyc2lvbgoJVGhpcyBpcyB1c2VkIHRvIGdldCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgYW5kIHRoZSBmaXJtd2FyZS4KCnNjYW50eXBlCglUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBzZXQgdGhlIHNjYW4gdHlwZSB0byBiZSB1c2VkIGJ5IHRoZSBkcml2ZXIgaW4KCXRoZSBzY2FuIGNvbW1hbmQuIFRoaXMgc2V0dGluZyB3aWxsIG5vdCBiZSB1c2VkIHdoaWxlIHBlcmZvcm1pbmcgYSBzY2FuCglmb3IgYSBzcGVjaWZpYyBTU0lELCBhcyBpdCBpcyBhbHdheXMgZG9uZSB3aXRoIHNjYW4gdHlwZSBiZWluZyBhY3RpdmUuCgoJd2hlcmUgdGhlIHN1Yi1jb21tYW5kcyBhcmU6IC0KCQkJYWN0aXZlIAktLSB0byBzZXQgdGhlIHNjYW4gdHlwZSB0byBhY3RpdmUKCQkJcGFzc2l2ZSAtLSB0byBzZXQgdGhlIHNjYW4gdHlwZSB0byBwYXNzaXZlCgkJCWdldCAJLS0gdG8gZ2V0IHRoZSBzY2FuIHR5cGUgc2V0IGluIHRoZSBkcml2ZXIKCmdldFNOUgoJVGhpcyBjb21tYW5kIGdldHMgdGhlIGF2ZXJhZ2UgYW5kIG5vbiBhdmVyYWdlIHZhbHVlIG9mIFNpZ25hbCB0byBOb2lzZQoJUmF0aW8gb2YgQmVhY29uIGFuZCBEYXRhLgoKCXdoZXJlIHZhbHVlIGlzOi0KCQkJMCAJLS0gQmVhY29uIG5vbi1hdmVyYWdlLgoJCQkxIAktLSBCZWFjb24gYXZlcmFnZS4KCQkJMiAJLS0gRGF0YSBub24tYXZlcmFnZS4KCQkJMyAJLS0gRGF0YSBhdmVyYWdlLgoKCUlmIG5vIHZhbHVlIGlzIGdpdmVuLCBhbGwgZm91ciB2YWx1ZXMgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciBtZW50aW9uZWQKCWFib3ZlLgoKCU5vdGU6IFRoaXMgY29tbWFuZCBpcyBhdmFpbGFibGUgb25seSB3aGVuIFNUQSBpcyBjb25uZWN0ZWQuCgpnZXRSU1NJCglUaGlzIGNvbW1hbmQgZ2V0cyB0aGUgYXZlcmFnZSBhbmQgbm9uIGF2ZXJhZ2UgdmFsdWUgb3MgUmVjZWl2ZSBTaWduYWwKCVN0cmVuZ3RoIG9mIEJlYWNvbiBhbmQgRGF0YS4KCgl3aGVyZSB2YWx1ZSBpczotCgkJCTAgCS0tIEJlYWNvbiBub24tYXZlcmFnZS4KCQkJMSAJLS0gQmVhY29uIGF2ZXJhZ2UuCgkJCTIgCS0tIERhdGEgbm9uLWF2ZXJhZ2UuCgkJCTMgCS0tIERhdGEgYXZlcmFnZS4KCglOb3RlOiBUaGlzIGNvbW1hbmQgaXMgYXZhaWxhYmxlIG9ubHkgd2hlbiBTVEEgaXMgY29ubmVjdGVkLgoKZ2V0TkYKCVRoaXMgY29tbWFuZCBnZXRzIHRoZSBhdmVyYWdlIGFuZCBub24gYXZlcmFnZSB2YWx1ZSBvZiBOb2lzZSBGbG9vciBvZgoJQmVhY29uIGFuZCBEYXRhLgoKCXdoZXJlIHZhbHVlIGlzOi0KCQkJMCAJLS0gQmVhY29uIG5vbi1hdmVyYWdlLgoJCQkxIAktLSBCZWFjb24gYXZlcmFnZS4KCQkJMiAJLS0gRGF0YSBub24tYXZlcmFnZS4KCQkJMyAJLS0gRGF0YSBhdmVyYWdlLgoKCU5vdGU6IFRoaXMgY29tbWFuZCBpcyBhdmFpbGFibGUgb25seSB3aGVuIFNUQSBpcyBjb25uZWN0ZWQuCgpzZXRyeGFudAoJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc2V0IHRoZSBtb2RlIGZvciBSeCBhbnRlbm5hLgoKCVRoZSBvcHRpb25zIHRoYXQgY2FuIGJlIHNlbnQgYXJlOi0KCQkJMSAJLS0gQW50ZW5uYSAxLgoJCQkyIAktLSBBbnRlbm5hIDIuCgkJCTB4RkZGRiAJLS0gRGl2ZXJzaXR5LgoKCVVzYWdlOgoJCWl3cHJpdiBldGhYIHNldHJ4YW50IDB4MDE6IHNlbGVjdCBBbnRlbm5hIDEuCgpnZXRyeGFudAoJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gZ2V0IHRoZSBtb2RlIGZvciBSeCBhbnRlbm5hLgoKCnNldHR4YW50CglUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBzZXQgdGhlIG1vZGUgZm9yIFR4IGFudGVubmEuCgkJVGhlIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2VudCBhcmU6LQoJCQkxIAktLSBBbnRlbm5hIDEuCgkJCTIgCS0tIEFudGVubmEgMi4KCQkJMHhGRkZGIAktLSBEaXZlcnNpdHkuCglVc2FnZToKCQlpd3ByaXYgZXRoWCBzZXR0eGFudCAweDAxOiBzZWxlY3QgQW50ZW5uYSAxLgoKZ2V0dHhhbnQKCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGdldCB0aGUgbW9kZSBmb3IgVHggYW50ZW5uYS4KCmF1dGhhbGdzCglUaGlzIGNvbW1hbmQgaXMgdXNlZCBieSB0aGUgV1BBIHN1cHBsaWNhbnQgdG8gc2V0IHRoZSBhdXRoZW50aWNhdGlvbgoJYWxnb3JpdGhtcyBpbiB0aGUgc3RhdGlvbi4KCjgwMjF4YXV0aGFsZ3MKCVRoaXMgY29tbWFuZCBpcyB1c2VkIGJ5IHRoZSBXUEEgc3VwcGxpY2FudCB0byBzZXQgdGhlIDgwMjEueCBhdXRoZW50aWNhdGlvbiBhbGdvcml0aG0gdHlwZQoJc3RhdGlvbi4KCgl3aGVyZSB2YWx1ZXMgY2FuIGJlOi0KCQkJMSAJLS0gTm9uZQoJCQkyIAktLSBMRUFQCgkJCTQgCS0tIFRMUwoJCQk4IAktLSBUVExzCgkJCTE2CS0tIE1ENQoKCmVuY3J5cHRpb25tb2RlCglUaGlzIGNvbW1hbmQgaXMgdXNlZCBieSB0aGUgV1BBIHN1cHBsaWNhbnQgdG8gc2V0IHRoZSBlbmNyeXB0aW9uIGFsZ29yaXRobS4KCgl3aGVyZSB2YWx1ZXMgY2FuIGJlOi0KCQkJMCAJLS0gTk9ORQoJCQkxIAktLSBXRVA0MAoJCQkyIAktLSBUS0lQCgkJCTMgCS0tIENDTVAKCQkJNCAJLS0gV0VQMTA0CgpwcmUtVEJUVAoJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc2V0IHByZS1UQlRUIHRpbWUgcGVyaW9kIHdoZXJlIHZhbHVlIGlzIGluIG1pY3Jvc2Vjb25kcy4KCnNldHJlZ2lvbmNvZGUKCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldCB0aGUgcmVnaW9uIGNvZGUgaW4gdGhlIHN0YXRpb24uCgl3aGVyZSB2YWx1ZSBpcyAncmVnaW9uIGNvZGUnIGZvciB2YXJpb3VzIHJlZ2lvbnMgbGlrZQoJVVNBIEZDQywgQ2FuYWRhIElDLCBTcGFpbiwgRnJhbmNlLCBFdXJvcGUgRVRTSSwJSmFwYW4gLi4uCgoJVXNhZ2U6CgkJaXdwcml2IGV0aFggc2V0cmVnaW9uY29kZSAweDEwOiBzZXQgcmVnaW9uIGNvZGUgdG8gVVNBICgweDEwKS4KCmdldHJlZ2lvbmNvZGUKCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGdldCB0aGUgcmVnaW9uIGNvZGUgaW5mb3JtYXRpb24gc2V0IGluIHRoZQoJc3RhdGlvbi4KCnNldGJjbmF2ZwoJU2V0IHRoZSB3ZWlnaHRpbmcgZmFjdG9yIGZvciBjYWxjdWxhdGluZyBSU1NJLgoKZ2V0YmNuYXZnCglHZXQgd2VpZ2h0aW5nIGZhY3RvciBmb3IgY2FsY3VsYXRpbmcgUlNTSS4KCnNldGRhdGFhdmcKCVNldCB0aGUgd2VpZ2h0aW5nIGZhY3RvciBmb3IgY2FsY3VsYXRpbmcgU05SLgoKc2V0bGlzdGVuaW50ZXIKCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldCB0aGUgbGlzdGVuIGludGVydmFsIGluIHRoZQoJc3RhdGlvbi4KCgl3aGVyZSB0aGUgdmFsdWUgcmFuZ2VzIGJldHdlZW4gMSAtIDI1NQoKZ2V0bGlzdGVuaW50ZXIKCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGdldCB0aGUgbGlzdGVuIGludGVydmFsIHZhbHVlIHNldCBpbiB0aGUKCXN0YXRpb24uCgpzZXRtdWx0aXBsZWR0aW0KCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldCB0aGUgbXVsdGlwbGUgZHRpbSB2YWx1ZSBpbiB0aGUKCXN0YXRpb24uCgkJd2hlcmUgdGhlIHZhbHVlIGlzIDEsMiwzLDQsNSwweGZmZmUKCQkweGZmZmUgbWVhbnMgdGhlIGZpcm13YXJlIHdpbGwgdXNlIGxpc3RlbiBpbnRlcnZhbCBpbiBhc3NvY2lhdGlvbgoJCWNvbW1hbmQgZm9yIHdha2luZyB1cAoKZ2V0bXVsdGlwbGVkdGltCglUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBnZXQgdGhlIG11bHRpcGxlIGR0aW0gdmFsdWUgc2V0IGluIHRoZSBzdGF0aW9uLgoKYXRpbXdpbmRvdwoJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc2V0IHRoZSBhdGltIHZhbHVlIGluIHRoZQoJc3RhdGlvbi4KCgl3aGVyZSB0aGUgdmFsdWUgcmFuZ2VzIGJldHdlZW4gMCAtIDUwCgpkZWF1dGgKCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNlbmQgdGhlIGRlLWF1dGhlbnRpY2F0aW9uIHRvIHRoZSBBUCB3aXRoIHdoaWNoCgl0aGUgc3RhdGlvbiBpcyBhc3NvY2lhdGVkLiBUaGlzIGNvbW1hbmQgaXMgdmFsaWQgb25seSB3aGVuCglzdGF0aW9uIGlzIGluIEluZnJhc3RydWN0dXJlIG1vZGUuCgoJTm90ZTogVGhpcyBjb21tYW5kIGlzIGF2YWlsYWJsZSBvbmx5IHdoZW4gU1RBIGlzIGNvbm5lY3RlZC4KCmFkaG9jc3RvcAoJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc3RvcCBiZWFjb24gdHJhbnNtaXNzaW9uIGZyb20gdGhlIHN0YXRpb24gYW5kCglnbyBpbnRvIGlkbGUgc3RhdGUgaW4gYWQtaG9jIG1vZGUuCgoJTm90ZTogVGhpcyBjb21tYW5kIGlzIGF2YWlsYWJsZSBvbmx5IHdoZW4gU1RBIGlzIGNvbm5lY3RlZC4KCnJhZGlvb24KCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHR1cm4gb24gdGhlIFJGIGFudGVubmEuCgpyYWRpb29mZgoJVGhpcyBjb21tYW5kIGlzIHN1ZWQgdG8gdHVybiBvZmYgdGhlIFJGIGFudGVubmEuCgpzY2FubW9kZQoJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc2V0IHRoZSBzdGF0aW9uIHRvIHNjYW4gZm9yIGVpdGhlciBJQlNTCgluZXR3b3JrcyBvciBCU1MgbmV0d29ya3Mgb3IgYm90aCBCU1MgYW5kIElCU1MgbmV0d29ya3MuIFRoaXMKCWNvbW1hbmQgY2FuIGJlIHVzZWQgd2l0aCBzdWIgY29tbWFuZHMsCgoJd2hlcmUgdGhlIHZhbHVlIGZvcgoJCQlic3MgCS0tIFNjYW4gQWxsIHRoZSBCU1MgbmV0d29ya3MuCgkJCWlic3MgCS0tIFNjYW4gQWxsIHRoZSBJQlNTIG5ldHdvcmtzLgoJCQlhbnkgCS0tIFNjYW4gYm90aCBCU1MgYW5kIElCU1MgbmV0d29ya3MuCgoKCnNldHdwYWllCglUaGlzIGNvbW1hbmQgaXMgdXNlZCBieSBXUEEgc3VwcGxpY2FudCB0byBzZW5kIHRoZSBXUEEtSUUgdG8gdGhlIGRyaXZlci4KCndsYW5pZGxlLW9mZgoJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gZ2V0IGludG8gaWRsZSBzdGF0ZS4KCglOb3RlOiBUaGlzIGNvbW1hbmQgaXMgYXZhaWxhYmxlIG9ubHkgd2hlbiBTVEEgaXMgY29ubmVjdGVkLgoKd2xhbmlkbGUtb24KCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGdldCBvZmYgdGhlIGlkbGUgc3RhdGUuCgoJTm90ZTogVGhpcyBjb21tYW5kIGlzIGF2YWlsYWJsZSBvbmx5IHdoZW4gU1RBIGlzIGNvbm5lY3RlZC4KCgpnZXRsb2cKCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGdldCB0aGUgODAyLjExIHN0YXRpc3RpY3MgYXZhaWxhYmxlIGluIHRoZQoJCXN0YXRpb24uCgoJTm90ZTogVGhpcyBjb21tYW5kIGlzIGF2YWlsYWJsZSBvbmx5IHdoZW4gU1RBIGlzIGNvbm5lY3RlZC4KCmdldGFkaG9jc3RhdHVzCglUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBnZXQgdGhlIGFkLWhvYyBOZXR3b3JrIFN0YXR1cy4KCglUaGUgdmFyaW91cyBzdGF0dXMgY29kZXMgYXJlOgoJCUFkaG9jU3RhcnRlZAoJCUFkaG9jSm9pbmVkCgkJQWRob2NJZGxlCgkJSW5mcmFNb2RlCgkJQXV0b1Vua25vd25Nb2RlCgoJTm90ZTogVGhpcyBjb21tYW5kIGlzIGF2YWlsYWJsZSBvbmx5IHdoZW4gU1RBIGlzIGNvbm5lY3RlZC4KCmFkaG9jZ3JhdGUKCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGVuYWJsZSgxKSBnX3JhdGUsIERpc2FibGUoMCkgZ19yYXRlCglhbmQgcmVxdWVzdCgyKSB0aGUgc3RhdHVzIHdoaWNoIGdfcmF0ZSBpcyBkaXNhYmxlZC9lbmFibGVkLAoJZm9yIEFkLWhvYyBjcmVhdG9yLgoKCXdoZXJlIHZhbHVlIGlzOi0KCQkwCS0tIERpc2FibGVkCgkJMQktLSBFbmFibGVkCgkJMgktLSBHZXQKCmxlZGdwaW8KCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldC9nZXQgTEVEcy4KCglpd3ByaXYgZXRoWCBsZWRncGlvIDxMRURzPgoJCXdpbGwgc2V0IHRoZSBjb3JyZXNwb25kaW5nIExFRCBmb3IgdGhlIEdQSU8gTGluZS4KCglpd3ByaXYgZXRoWCBsZWRncGlvCgkJd2lsbCBnaXZlIHUgd2hpY2ggTEVEcyBhcmUgRW5hYmxlZC4KCglVc2FnZToKCQlpd3ByaXYgZXRoMSBsZWRncGlvIDEgMCAyIDEgMyA0CgkJCXdpbGwgZW5hYmxlCgkJCUxFRCAxIC0+IEdQSU8gMAoJCQlMRUQgMiAtPiBHUElPIDEKCQkJTEVEIDMgLT4gR1BJTyA0CgoJCWl3cHJpdiBldGgxIGxlZGdwaW8KCQkJc2hvd3MgTEVEIGluZm9ybWF0aW9uIGluIHRoZSBmb3JtYXQgYXMgbWVudGlvbmVkIGFib3ZlLgoKCU5vdGU6IExFRDAgaXMgaW52YWxpZAoJTm90ZTogTWF4aW11bSBOdW1iZXIgb2YgTEVEcyBhcmUgMTYuCgppbmFjdGl2aXR5dG8KCVRoaXMgY29tbWFuZCBpcyB1c2VkIGJ5IHRoZSBob3N0IHRvIHNldC9nZXQgdGhlIGluYWN0aXZpdHkgdGltZW91dCB2YWx1ZSwKCXdoaWNoIHNwZWNpZmllcyB3aGVuIFdMQU4gZGV2aWNlIGlzIHB1dCB0byBzbGVlcC4KCglVc2FnZToKCQlpd3ByaXYgZXRoWCBpbmFjdGl2aXR5dG8gWzx0aW1lb3V0Pl0KCgl3aGVyZSB0aGUgcGFyYW1ldGVyIGFyZToKCQl0aW1lb3V0OiB0aW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kcy4KCglFeGFtcGxlOgoJCWl3cHJpdiBldGgxIGluYWN0aXZpdHl0bwoJCQkiZ2V0IHRoZSB0aW1lb3V0IHZhbHVlIgoKCQlpd3ByaXYgZXRoMSBpbmFjdGl2aXR5dG8gWAoJCQkic2V0IHRpbWVvdXQgdmFsdWUgdG8gWCBtcyIKCgpzbGVlcHBkCglUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIHNsZWVwIHBlcmlvZCBvZiB0aGUgV0xBTiBkZXZpY2UuCgoJVXNhZ2U6CgkJaXdwcml2IGV0aFggc2xlZXBwZCBbPHNsZWVwIHBlcmlvZD5dCgoJd2hlcmUgdGhlIHBhcmFtZXRlciBhcmU6CgkJUGVyaW9kOiBzbGVlcCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzLiBSYW5nZSAxMH42MC4KCglFeGFtcGxlOgoJCWl3cHJpdiBldGgxIHNsZWVwcGQgMTAKCQkJInNldCBwZXJpb2QgYXMgMTAgbXMiCgkJaXdwcml2IGV0aDEgc2xlZXBwZAoJCQkiZ2V0IHRoZSBzbGVlcCBwZXJpb2QgY29uZmlndXJhdGlvbiIKCmVuYWJsZTExZAoJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gY29udHJvbCAxMWQKCXdoZXJlIHZhbHVlIGlzOi0KCQkxCS0tIEVuYWJsZWQKCQkwCS0tIERpc2FibGVkCgkJMgktLSBHZXQKCgoKCnRwY2NmZwoJRW5hYmxlcyBvciBkaXNhYmxlcyBhdXRvbWF0aWMgdHJhbnNtaXQgcG93ZXIgY29udHJvbC4KCglUaGUgZmlyc3QgcGFyYW1ldGVyIHR1cm5zIHRoaXMgZmVhdHVyZSBvbiAoMSkgb3Igb2ZmICgwKS4gIFdoZW4gdHVybmluZwoJb24sIHRoZSB1c2VyIG11c3QgYWxzbyBzdXBwbHkgZm91ciBtb3JlIHBhcmFtZXRlcnMgaW4gdGhlIGZvbGxvd2luZwoJb3JkZXI6CgkJLVVzZVNOUiAoVXNlIFNOUiAoaW4gYWRkaXRpb24gdG8gUEVSKSBmb3IgVFBDIGFsZ29yaXRobSksCgkJLVAwIChQMCBwb3dlciBsZXZlbCBmb3IgVFBDKSwKCQktUDEgKFAxIHBvd2VyIGxldmVsIGZvciBUUEMpLAoJCS1QMiAoUDIgcG93ZXIgbGV2ZWwgZm9yIFRQQykuCgoJVXNhZ2U6CgkJaXdwcml2IGV0aFggdHBjY2ZnOiBHZXQgY3VycmVudCBjb25maWd1cmF0aW9uCgkJaXdwcml2IGV0aFggdHBjY2ZnIDA6IGRpc2FibGUgYXV0byBUUEMKCQlpd3ByaXYgZXRoWCB0cGNjZmcgMHgwMSAweDAwIDB4MDUgMHgwYSAweDBkOiBlbmFibGUgYXV0byBUUEM7IGRvIG5vdCB1c2UgU05SOwoJCQkJCQkJICAgICBQMD0weDA1OyBQMT0weDBhOyBQMj0weDBkOwoJCWl3cHJpdiBldGhYIHRwY2NmZyAweDAxIDB4MDEgMHgwNSAweDBhIDB4MGQ6IGVuYWJsZSBhdXRvIFRQQzsgdXNlIFNOUjsKCQkJCQkJCSAgICAgUDA9MHgwNTsgUDE9MHgwYTsgUDI9MHgwZC4KCnBvd2VyY2ZnCglFbmFibGVzIG9yIGRpc2FibGVzIHBvd2VyIGFkYXB0YXRpb24uCgoJVGhlIGZpcnN0IHBhcmFtZXRlciB0dXJucyB0aGlzIGZlYXR1cmUgb24gKDEpIG9yIG9mZiAoMCkuICBXaGVuIHR1cm5pbmcKCW9uLCB0aGUgdXNlciBtdXN0IGFsc28gc3VwcGx5IHRocmVlIG1vcmUgcGFyYW1ldGVycyBpbiB0aGUgZm9sbG93aW5nCglvcmRlcjoKCQktUDAgKFAwIHBvd2VyIGxldmVsIGZvciBQb3dlciBBZGFwdGF0aW9uKSwKCQktUDEgKFAxIHBvd2VyIGxldmVsIGZvciBQb3dlciBBZGFwdGF0aW9uKSwKCQktUDIgKFAyIHBvd2VyIGxldmVsIGZvciBQb3dlciBBZGFwdGF0aW9uKS4KCglVc2FnZToKCQlpd3ByaXYgZXRoWCBwb3dlcmNmZzogR2V0IGN1cnJlbnQgY29uZmlndXJhdGlvbgoJCWl3cHJpdiBldGhYIHBvd2VyY2ZnIDA6IGRpc2FibGUgcG93ZXIgYWRhcHRhdGlvbgoJCWl3cHJpdiBldGhYIHBvd2VyY2ZnIDEgMHgwZCAweDBmIDB4MTI6IGVuYWJsZSBwb3dlciBhZGFwdGF0aW9uOwoJCQkJCQkgICAgICAgUDA9MHgwZDsgUDE9MHgwZjsgUDI9MHgxMi4KCmdldGFmYwoJVGhpcyBjb21tYW5kIHJldHVybnMgYXV0b21hdGljIGZyZXF1ZW5jeSBjb250cm9sIHBhcmFtZXRlcnMuICBJdCByZXR1cm5zCgl0aHJlZSBpbnRlZ2VyczoKCQktUDA6IGF1dG9tYXRpYyBpcyBvbiAoMSksIG9yIG9mZiAoMCksCgkJLVAxOiBjdXJyZW50IHRpbWluZyBvZmZzZXQgaW4gUFBNIChwYXJ0IHBlciBtaWxsaW9uKSwgYW5kCgkJLVAyOiBjdXJyZW50IGZyZXF1ZW5jeSBvZmZzZXQgaW4gUFBNLgoKc2V0YWZjCglTZXQgYXV0b21hdGljIGZyZXF1ZW5jeSBjb250cm9sIG9wdGlvbnMuCgoJVGhlIGZpcnN0IHBhcmFtZXRlciB0dXJucyBhdXRvbWF0aWMgb24gKDEpIG9yIG9mZiAoMCkuCglUaGUgdXNlciBtdXN0IHN1cHBseSB0d28gbW9yZSBwYXJhbWV0ZXJzIGluIGVpdGhlciBjYXNlLCBpbiB0aGUgZm9sbG93aW5nCiAgb3JkZXI6CgogIFdoZW4gYXV0byBpcyBvbjoKCgkJLVAwIChhdXRvbWF0aWMgYWRqdXN0bWVudCBmcmVxdWVuY3kgdGhyZXNob2xkIGluIFBQTSksCgkJLVAxIChhdXRvbWF0aWMgYWRqdXN0bWVudCBwZXJpb2QgaW4gYmVhY29uIHBlcmlvZCksCgogIFdoZW4gYXV0byBpcyBvZmY6CgoJCS1QMCAobWFudWFsIGFkanVzdG1lbnQgdGltaW5nIG9mZnNldCBpbiBQUE0pLCBhbmQKCQktUDEgKG1hbnVhbCBhZGp1c3RtZW50IGZyZXF1ZW5jeSBvZmZzZXQgaW4gUFBNKS4KCglVc2FnZToKCQlpd3ByaXYgZXRoWCBzZXRhZmMgMCAxMCAxMDogbWFudWFsIGFkanVzdG1lbnQsIGJvdGggdGltaW5nIGFuZCBmcmVxdWNuY3kKICAgIG9mZnNldCBhcmUgMTAgUFBNLgoKCQlpd3ByaXYgZXRoWCBzZXRhZmMgMSAxMCAxMCBlbmFibGUgYWZjLCBhdXRvbWF0aWMgYWRqdXN0bWVudCwKICAgIGZyZXF1ZW5jeSB0aHJlc2hvbGQgMTAgUFBNLCBmb3IgZXZlcnkgMTAgYmVhY29uIHBlcmlvZHMuCgoKCnNjYW5wcm9iZXMKCVRoaXMgY29tbWFuZCBzZXRzIG51bWJlciBvZiBwcm9iZSByZXF1ZXN0cyBwZXIgY2hhbm5lbC4KCglVc2FnZToKCQlpd3ByaXYgZXRoWCBzY2FucHJvYmVzIDMgKHNldCBzY2FuIHByb2JlcyB0byAzKQoJCWl3cHJpdiBldGhYIHNjYW5wcm9iZXMgICAoZ2V0IHNjYW4gcHJvYmVzKQoKbG9saXN0ZW5pbnRlcgoJVGhpcyBjb21tYW5kIHNldHMgdGhlIHZhbHVlIG9mIGxpc3RlbiBpbnRlcnZhbC4KCglVc2FnZToKCWl3cHJpdiBldGhYIGxvbGlzdGVuaW50ZXIgMjM0IChzZXQgdGhlIGxvbGlzdGVuaW50ZXIgdG8gMjM0KQoJaXdwcml2IGV0aFggbG9saXN0ZW5pbnRlciAgICAgKGdldCB0aGUgbG9saXN0ZW5pbnRlciB2YWx1ZSkKCnJhdGVhZGFwdAoJVGhpcyBjb21tYW5kIHNldHMgdGhlIGRhdGEgcmF0ZXMgYml0bWFwLgoJV2hlcmUgPG4+CgkJMDogRGlzYWJsZSBhdXRvIHJhdGUgYWRhcHQKCQkxOiBFbmFibGUgYXV0byByYXRlIGFkYXB0CgoJICAgICAgPG0+CgkJIGRhdGEgcmF0ZSBiaXRtYXAKCQkJQml0CURhdGEgcmF0ZQoJCQkwCTEgTWJwcwoJCQkxCTIgTWJwcwoJCQkyCTUuNSBNYnBzCgkJCTMJMTEgTWJwcwoJCQk0CVJlc2VydmVkCgkJCTUJNiBNYnBzCgkJCTYJOSBNYnBzCgkJCTcJMTIgTWJwcwoJCQk4CTE4IE1icHMKCQkJOQkyNCBNYnBzCgkJCTEwCTM2IE1icHMKCQkJMTEJNDggTWJwcwoJCQkxMgk1NCBNYnBzCgkJCTEyLTE1CVJlc2VydmVkCgoJVXNhZ2U6Cglpd3ByaXYgZXRoWCByYXRlYWRhcHQKCQkJcmVhZCB0aGUgY3VycmVjdCBkYXRhIHJhdGUgc2V0dGluZwoJaXdwcml2IGV0aFggcmF0ZWFkYXB0IDEgMHgwNwoJCQllbmFibGUgYXV0byBkYXRhIHJhdGUgYWRhcHQgYW5kCgkJCWRhdGEgcmF0ZXMgYXJlIDFNYnBzLCAyTWJzcCBhbmQgNS41TWJwcwoKCnR4Y29udHJvbAoJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc2V0IHRoZSBUeCByYXRlLCBhY2sgcG9saWN5LCBhbmQgcmV0cnkgbGltaXQgb24gYSBwZXIgcGFja2V0IGJhc2lzLgoKCVdoZXJlIHZhbHVlIDxuPiBpczoKCSAgICBpZiBiaXRbNF0gPT0gMToKCQliaXRbMzowXSAgICAgICAgLS0gMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAgIDEwICAgMTEgICAxMiAgIDEzLTE2CgkJRGF0YSBSYXRlKE1icHMpIC0tIDEgICAyICAgNS41IDExICBSc3YgNiAgIDkgICAxMiAgMTggIDI0ICAzNiAgIDQ4ICAgNTQgICBSc3YKCgkgICAgYml0WzEyOjhdCgkJaWYgYml0WzEyXSA9PSAxLCBiaXRbMTE6OF0gc3BlY2lmaWVzIHRoZSBUeCByZXRyeSBsaW1pdC4KCgkgICAgYml0WzE0OjEzXSBzcGVjaWZpZXMgcGVyIHBhY2tldCBhY2sgcG9saWN5OgoJCWJpdFsxNDoxM10KCQkgICAgIDEgIDAJdXNlIGltbWVkaWF0ZSBhY2sgcG9saWN5IGZvciB0aGlzIHBhY2tldAoJCSAgICAgMSAgMSAgICAgICB1c2Ugbm8gYWNrIHBvbGljeSBmb3IgdGhpcyBwYWNrZXQKCQkgICAgIDAgIHgJdXNlIHRoZSBwZXItcGFja2V0IGFjayBwb2xpY3kgc2V0dGluZwoKCVVzYWdlOgoJaXdwcml2IGV0aFggdHhjb250cm9sIDB4NzUxMwoJCQlVc2Ugbm8tYWNrIHBvbGljeSwgNSByZXRpcmVzIGZvciBUeCwgMTFNYnBzIHJhdGUKCgoKcHNudWxsaW50ZXJ2YWwKCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldC9yZXF1ZXN0IE5VTEwgcGFja2FnZSBpbnRlcnZhbCBmb3IgUG93ZXIgU2F2ZQoJdW5kZXIgaW5mcmFzdHJ1Y3R1cmUgbW9kZS4KCgl3aGVyZSB2YWx1ZSBpczotCgkJLTEJLS0gRGlzYWJsZWQKCQluPjAJLS0gU2V0IGludGVydmFsIGFzIG4gKHNlY29uZHMpCgpwcmVzY2FuCglUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBlbmFibGUgKDEpL2Rpc2FibGUoMCkgYXV0byBwcmVzY2FuIGJlZm9yZSBhc3NvaWNhdGUgdG8gdGhlIGFwCgoJd2hlcmUgdmFsdWUgaXM6LQoJCTAJLS0gRGlzYWJsZWQKCQkxCS0tIEVuYWJsZWQKCQkyICAgICAgIC0tIEdldAoKZ2V0cnhpbmZvCglUaGlzIGNvbW1hbmQgZ2V0cyBub24gYXZlcmFnZSB2YWx1ZSBvZiBTaWduYWwgdG8gTm9pc2UgUmF0aW8gb2YgRGF0YSBhbmQgcmF0ZSBpbmRleC4KCglUaGUgZm9sbG93aW5nIHRhYmxlIHNob3dzIFJhdGVJbmRleCBhbmQgUmF0ZQoKCQkgICAgIFJhdGVJbmRleAlEYXRhIHJhdGUKCQkJMAkxIE1icHMKCQkJMQkyIE1icHMKCQkJMgk1LjUgTWJwcwoJCQkzCTExIE1icHMKCQkJNAlSZXNlcnZlZAoJCQk1CTYgTWJwcwoJCQk2CTkgTWJwcwoJCQk3CTEyIE1icHMKCQkJOAkxOCBNYnBzCgkJCTkJMjQgTWJwcwoJCQkxMAkzNiBNYnBzCgkJCTExCTQ4IE1icHMKCQkJMTIJNTQgTWJwcwoJCQkxMy0xNQlSZXNlcnZlZAoKZ2V0dHhyYXRlCglUaGlzIGNvbW1hbmQgZ2V0cyBjdXJyZW50IFR4IHJhdGUgaW5kZXggb2YgdGhlIGZpcnN0IHBhY2tldCBhc3NvY2lhdGVkIHdpdGggUmF0ZSBBZGFwdGF0aW9uLgoKCVRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MgUmF0ZUluZGV4IGFuZCBSYXRlCgoJCSAgICAgUmF0ZUluZGV4CURhdGEgcmF0ZQoJCQkwCTEgTWJwcwoJCQkxCTIgTWJwcwoJCQkyCTUuNSBNYnBzCgkJCTMJMTEgTWJwcwoJCQk0CVJlc2VydmVkCgkJCTUJNiBNYnBzCgkJCTYJOSBNYnBzCgkJCTcJMTIgTWJwcwoJCQk4CTE4IE1icHMKCQkJOQkyNCBNYnBzCgkJCTEwCTM2IE1icHMKCQkJMTEJNDggTWJwcwoJCQkxMgk1NCBNYnBzCgkJCTEzLTE1CVJlc2VydmVkCgpiY25pbnRlcnZhbAoJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc2V0cyBiZWFjb24gaW50ZXJ2YWwgaW4gYWRob2MgbW9kZSB3aGVuIGFuIGFyZ3VtZW50IGlzIGdpdmVuLCBhbmQgZ2V0cyBjdXJyZW50IGFkaG9jCgliZWFjb24gaW50ZXJ2YWwgd2hlbiBubyBhcmd1bWVudCBpcyBnaXZlbi4gVGhlIHZhbGlkIGJlYWNvbiBpbnRlcnZhbCBpcyBiZXR3ZWVuIDIwIC0gMTAwMCwKCWRlZmF1bHQgYmVhY29uIGludGVydmFsIGlzIDEwMC4KCglVc2FnZToKCQlpd3ByaXYgZXRoWCBiY25pbnRlcnZhbCAxMDAgIChzZXQgYWRob2MgYmVhY29uIGludGVydmFsIHRvIDEwMCkKCQlpd3ByaXYgZXRoWCBiY25pbnRlcnZhbCAgICAgIChnZXQgYWRob2MgYmVhY29uIGludGVydmFsKQoKZnd0X2FkZAoJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gaW5zZXJ0IGFuIGVudHJ5IGludG8gdGhlIEZXVCB0YWJsZS4gVGhlIGxpc3Qgb2YKCXBhcmFtZXRlcnMgbXVzdCBmb2xsb3cgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CgoJaXdwcml2IGV0aFggZnd0X2FkZCBkYSByYSBbbWV0cmljIGRpciBzc24gZHNuIGhvcGNvdW50IHR0bCBleHBpcmF0aW9uIHNsZWVwbW9kZSBzbnJdCgoJVGhlIHBhcmFtZXRlcnMgYmV0d2VlbiBicmFja2V0cyBhcmUgb3B0aW9uYWwsIGJ1dCB0aGV5IG11c3QgYXBwZWFyIGluCgl0aGUgb3JkZXIgc3BlY2lmaWVkLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhlIG1ldHJpYywKCXlvdSBtdXN0IGFsc28gc3BlY2lmeSB0aGUgZGlyLCBzc24sIGFuZCBkc24gYnV0IHlvdSBuZWVkIG5vdCBzcGVjaWZ5IHRoZQoJaG9wY291bnQsIGV4cGlyYXRpb24sIHNsZWVwbW9kZSwgb3Igc25yLiAgQW55IHVuc3BlY2lmaWVkIHBhcmFtZXRlcnMKCXdpbGwgYmUgYXNzaWduZWQgdGhlIGRlZmF1bHRzIHNwZWNpZmllZCBiZWxvdy4KCglUaGUgZGlmZmVyZW50IHBhcmFtZXRlcnMgYXJlOi0KCQlkYQkJLS0gREEgTUFDIGFkZHJlc3MgaW4gdGhlIGZvcm0gMDA6MTE6MjI6MzM6NDQ6NTUKCQlyYQkJLS0gUkEgTUFDIGFkZHJlc3MgaW4gdGhlIGZvcm0gMDA6MTE6MjI6MzM6NDQ6NTUKCQltZXRyaWMJCS0tIHJvdXRlIG1ldHJpYyAoY29zdDogc21hbGxlci1tZXRyaWMgcm91dGVzIGFyZQoJCQkJICAgcHJlZmVycmVkLCBkZWZhdWx0IGlzIDApCgkJZGlyCQktLSBkaXJlY3Rpb24gKDEgZm9yIGRpcmVjdCwgMCBmb3IgcmV2ZXJzZSwKCQkJCSAgIGRlZmF1bHQgaXMgMSkKCQlzc24JCS0tIFNvdXJjZSBTZXF1ZW5jZSBOdW1iZXIgKHRpbWUgYXQgdGhlIFJBIGZvcgoJCQkJICAgcmV2ZXJzZSByb3V0ZXMuICBEZWZhdWx0IGlzIDApCgkJZHNuCQktLSBEZXN0aW5hdGlvbiBTZXF1ZW5jZSBOdW1iZXIgKHRpbWUgYXQgdGhlIERBCgkJCQkgICBmb3IgZGlyZWN0IHJvdXRlcy4gIERlZmF1bHQgaXMgMCkKCQlob3Bjb3VudAktLSBob3AgY291bnQgKGN1cnJlbnRseSB1bnVzZWQsIGRlZmF1bHQgaXMgMCkKCQl0dGwJCS0tIFRUTCAoT25seSB1c2VkIGluIHJldmVyc2UgZW50cmllcykKCQlleHBpcmF0aW9uCS0tIGVudHJ5IGV4cGlyYXRpb24gKGluIHRpY2tzLCB3aGVyZSBhIHRpY2sgaXMKCQkJCSAgIDEwMjR1cywgb3IgfiAxbXMuIFVzZSAwIGZvciBhbiBpbmRlZmluaXRlCgkJCQkgICBlbnRyeSwgZGVmYXVsdCBpcyAwKQoJCXNsZWVwbW9kZQktLSBSQSdzIHNsZWVwIG1vZGUgKGN1cnJlbnRseSB1bnVzZWQsIGRlZmF1bHQgaXMKCQkJCSAgIDApCgkJc25yCQktLSBTTlIgaW4gdGhlIGxpbmsgdG8gUkEgKGN1cnJlbnRseSB1bnVzZWQsCgkJCQkgICBkZWZhdWx0IGlzIDApCgoJVGhlIGNvbW1hbmQgZG9lcyBub3QgcmV0dXJuIGFueXRoaW5nLgoKZnd0X2RlbAoJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gcmVtb3ZlIGFuIGVudHJ5IHRvIHRoZSBGV1QgdGFibGUuIFRoZSBsaXN0IG9mCglwYXJhbWV0ZXJzIG11c3QgZm9sbG93IHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgoKCQlpd3ByaXYgZXRoWCBmd3RfZGVsIGRhIHJhIFtkaXJdCgoJd2hlcmUgdGhlIGRpZmZlcmVudCBwYXJhbWV0ZXJzIGFyZTotCgkJZGEJCS0tIERBIE1BQyBhZGRyZXNzIChpbiB0aGUgZm9ybSAiMDA6MTE6MjI6MzM6NDQ6NTUiKQoJCXJhCQktLSBSQSBNQUMgYWRkcmVzcyAoaW4gdGhlIGZvcm0gIjAwOjExOjIyOjMzOjQ0OjU1IikKCQlkaXIJCS0tIGRpcmVjdGlvbiAoMSBmb3IgZGlyZWN0LCAwIGZvciByZXZlcnNlLAoJCQkJICAgZGVmYXVsdCBpcyAxKQoKCVRoZSBjb21tYW5kIGRvZXMgbm90IHJldHVybiBhbnl0aGluZy4KCmZ3dF9sb29rdXAKCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGdldCB0aGUgYmVzdCByb3V0ZSBpbiB0aGUgRldUIHRhYmxlIHRvIGEgZ2l2ZW4KCWhvc3QuIFRoZSBvbmx5IHBhcmFtZXRlciBpcyB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIGhvc3QgdGhhdCBpcyBiZWluZwoJbG9va2VkIGZvci4KCgkJaXdwcml2IGV0aFggZnd0X2xvb2t1cCBkYQoKCXdoZXJlOi0KCQlkYQkJLS0gREEgTUFDIGFkZHJlc3MgKGluIHRoZSBmb3JtICIwMDoxMToyMjozMzo0NDo1NSIpCgoJVGhlIGNvbW1hbmQgcmV0dXJucyBhbiBvdXRwdXQgc3RyaW5nIGlkZW50aWNhbCB0byB0aGUgb25lIHJldHVybmVkIGJ5Cglmd3RfbGlzdCBkZXNjcmliZWQgYmVsb3cuCgoKZnd0X2xpc3QKCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGxpc3QgYSByb3V0ZSBmcm9tIHRoZSBGV1QgdGFibGUuIFRoZSBvbmx5CglwYXJhbWV0ZXIgaXMgdGhlIGluZGV4IGludG8gdGhlIHRhYmxlLiBJZiB5b3Ugd2FudCB0byBsaXN0IGFsbCB0aGUKCXJvdXRlcyBpbiBhIHRhYmxlLCBzdGFydCB3aXRoIGluZGV4PTAsIGFuZCBrZWVwIGxpc3RpbmcgdW50aWwgeW91IGdldCBhCgkiKG51bGwpIiBzdHJpbmcuICBOb3RlIHRoYXQgdGhlIGluZGljaWVzIG1heSBjaGFuZ2UgYXMgdGhlIGZ3dCBpcwoJdXBkYXRlZC4gIEl0IGlzIGV4cGVjdGVkIHRoYXQgbW9zdCB1c2VycyB3aWxsIG5vdCB1c2UgZnd0X2xpc3QgZGlyZWN0bHksCglidXQgdGhhdCBhIHV0aWxpdHkgc2ltaWxhciB0byB0aGUgdHJhZGl0aW9uYWwgcm91dGUgY29tbWFuZCB3aWxsIGJlIHVzZWQKCXRvIGludm9rZSBmd3RfbGlzdCBvdmVyIGFuZCBvdmVyLgoKCQlpd3ByaXYgZXRoWCBmd3RfbGlzdCBpbmRleAoKCVRoZSBvdXRwdXQgaXMgYSBzdHJpbmcgb2YgdGhlIGZvbGxvd2luZyBmb3JtOgoKCQlkYSByYSBtZXRyaWMgZGlyIHNzbiBkc24gaG9wY291bnQgdHRsIGV4cGlyYXRpb24gc2xlZXBtb2RlIHNucgoKCXdoZXJlIHRoZSBkaWZmZXJlbnQgZmllbGRzIGFyZTotCgkJZGEJCS0tIERBIE1BQyBhZGRyZXNzIChpbiB0aGUgZm9ybSAiMDA6MTE6MjI6MzM6NDQ6NTUiKQoJCXJhCQktLSBSQSBNQUMgYWRkcmVzcyAoaW4gdGhlIGZvcm0gIjAwOjExOjIyOjMzOjQ0OjU1IikKCQltZXRyaWMJCS0tIHJvdXRlIG1ldHJpYyAoY29zdDogc21hbGxlci1tZXRyaWMgcm91dGVzIGFyZSBwcmVmZXJyZWQpCgkJZGlyCQktLSBkaXJlY3Rpb24gKDEgZm9yIGRpcmVjdCwgMCBmb3IgcmV2ZXJzZSkKCQlzc24JCS0tIFNvdXJjZSBTZXF1ZW5jZSBOdW1iZXIgKHRpbWUgYXQgdGhlIFJBIGZvciByZXZlcnNlIHJvdXRlcykKCQlkc24JCS0tIERlc3RpbmF0aW9uIFNlcXVlbmNlIE51bWJlciAodGltZSBhdCB0aGUgREEgZm9yIGRpcmVjdCByb3V0ZXMpCgkJaG9wY291bnQJLS0gaG9wIGNvdW50IChjdXJyZW50bHkgdW51c2VkKQoJCXR0bAkJLS0gVFRMIChvbmx5IHVzZWQgaW4gcmV2ZXJzZSBlbnRyaWVzKQoJCWV4cGlyYXRpb24JLS0gZW50cnkgZXhwaXJhdGlvbiAoaW4gdGlja3MsIHdoZXJlIGEgdGljayBpcyAxMDI0dXMsIG9yIH4gMW1zLiBVc2UgMCBmb3IgYW4gaW5kZWZpbml0ZSBlbnRyeSkKCQlzbGVlcG1vZGUJLS0gUkEncyBzbGVlcCBtb2RlIChjdXJyZW50bHkgdW51c2VkKQoJCXNucgkJLS0gU05SIGluIHRoZSBsaW5rIHRvIFJBIChjdXJyZW50bHkgdW51c2VkKQoKZnd0X2xpc3Rfcm91dGUKCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGxpc3QgYSByb3V0ZSBmcm9tIHRoZSBGV1QgdGFibGUuIFRoZSBvbmx5CglwYXJhbWV0ZXIgaXMgdGhlIHJvdXRlIElELiBJZiB5b3Ugd2FudCB0byBsaXN0IGFsbCB0aGUgcm91dGVzIGluIGEKCXRhYmxlLCBzdGFydCB3aXRoIHJpZD0wLCBhbmQga2VlcCBpbmNyZW1lbnRpbmcgcmlkIHVudGlsIHlvdSBnZXQgYQoJIihudWxsKSIgc3RyaW5nLiBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gZnd0X2xpc3QuIFRoZSBvbmx5CglkaWZmZXJlbmNlIGlzIHRoZSBvdXRwdXQgZm9ybWF0LiAgQWxzbyBub3RlIHRoYXQgdGhpcyBjb21tYW5kIGlzIG1lYW50Cglmb3IgZGVidWdnaW5nLiAgSXQgaXMgZXhwZWN0ZWQgdGhhdCB1c2VycyB3aWxsIHVzZSBmd3RfbG9va3VwIGFuZAoJZnd0X2xpc3QuICBPbmUgaW1wb3J0YW50IHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHRoZSByb3V0ZSBpZCBtYXkgY2hhbmdlCglhcyB0aGUgcm91dGUgdGFibGUgaXMgYWx0ZXJlZC4KCgkJaXdwcml2IGV0aFggZnd0X2xpc3Rfcm91dGUgcmlkCgoJVGhlIG91dHB1dCBpcyBhIHN0cmluZyBvZiB0aGUgZm9sbG93aW5nIGZvcm06CgoJCWRhIG1ldHJpYyBkaXIgbmlkIHNzbiBkc24gaG9wY291bnQgdHRsIGV4cGlyYXRpb24KCgl3aGVyZSB0aGUgZGlmZmVyZW50IGZpZWxkcyBhcmU6LQoJCWRhCQktLSBEQSBNQUMgYWRkcmVzcyAoaW4gdGhlIGZvcm0gIjAwOjExOjIyOjMzOjQ0OjU1IikKCQltZXRyaWMJCS0tIHJvdXRlIG1ldHJpYyAoY29zdDogc21hbGxlci1tZXRyaWMgcm91dGVzIGFyZSBwcmVmZXJyZWQpCgkJZGlyCQktLSBkaXJlY3Rpb24gKDEgZm9yIGRpcmVjdCwgMCBmb3IgcmV2ZXJzZSkKCQluaWQJCS0tIE5leHQtaG9wIChuZWlnaGJvcikgaG9zdCBJRCAobmlkKQoJCXNzbgkJLS0gU291cmNlIFNlcXVlbmNlIE51bWJlciAodGltZSBhdCB0aGUgUkEgZm9yIHJldmVyc2Ugcm91dGVzKQoJCWRzbgkJLS0gRGVzdGluYXRpb24gU2VxdWVuY2UgTnVtYmVyICh0aW1lIGF0IHRoZSBEQSBmb3IgZGlyZWN0IHJvdXRlcykKCQlob3Bjb3VudAktLSBob3AgY291bnQgKGN1cnJlbnRseSB1bnVzZWQpCgkJdHRsCQktLSBUVEwgY291bnQgKG9ubHkgdXNlZCBpbiByZXZlcnNlIGVudHJpZXMpCgkJZXhwaXJhdGlvbgktLSBlbnRyeSBleHBpcmF0aW9uIChpbiB0aWNrcywgd2hlcmUgYSB0aWNrIGlzIDEwMjR1cywgb3IgfiAxbXMuIFVzZSAwIGZvciBhbiBpbmRlZmluaXRlIGVudHJ5KQoKZnd0X2xpc3RfbmVpZ2gKCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGxpc3QgYSBuZWlnaGJvciBmcm9tIHRoZSBGV1QgdGFibGUuIFRoZSBvbmx5CglwYXJhbWV0ZXIgaXMgdGhlIG5laWdoYm9yIElELiBJZiB5b3Ugd2FudCB0byBsaXN0IGFsbCB0aGUgbmVpZ2hib3JzIGluIGEKCXRhYmxlLCBzdGFydCB3aXRoIG5pZD0wLCBhbmQga2VlcCBpbmNyZW1lbnRpbmcgbmlkIHVudGlsIHlvdSBnZXQgYQoJIihudWxsKSIgc3RyaW5nLiAgTm90ZSB0aGF0IHRoZSBuaWQgZnJvbSBhIGZ3dF9saXN0X3JvdXRlIGNvbW1hbmQgY2FuIGJlCgl1c2VkIGFzIGFuIGlucHV0IHRvIHRoaXMgY29tbWFuZC4gIEFsc28gbm90ZSB0aGF0IHRoaXMgY29tbWFuZCBpcyBtZWFudAoJbW9zdGx5IGZvciBkZWJ1Z2dpbmcuICBJdCBpcyBleHBlY3RlZCB0aGF0IHVzZXJzIHdpbGwgdXNlIGZ3dF9sb29rdXAuCglPbmUgaW1wb3J0YW50IHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHRoZSBuZWlnaGJvciBpZCBtYXkgY2hhbmdlIGFzIHRoZQoJbmVpZ2hib3IgdGFibGUgaXMgYWx0ZXJlZC4KCgkJaXdwcml2IGV0aFggZnd0X2xpc3RfbmVpZ2ggbmlkCgoJVGhlIG91dHB1dCBpcyBhIHN0cmluZyBvZiB0aGUgZm9sbG93aW5nIGZvcm06CgoJCXJhIHNsZWVwbW9kZSBzbnIgcmVmZXJlbmNlcwoKCXdoZXJlIHRoZSBkaWZmZXJlbnQgZmllbGRzIGFyZTotCgkJcmEJCS0tIFJBIE1BQyBhZGRyZXNzIChpbiB0aGUgZm9ybSAiMDA6MTE6MjI6MzM6NDQ6NTUiKQoJCXNsZWVwbW9kZQktLSBSQSdzIHNsZWVwIG1vZGUgKGN1cnJlbnRseSB1bnVzZWQpCgkJc25yCQktLSBTTlIgaW4gdGhlIGxpbmsgdG8gUkEgKGN1cnJlbnRseSB1bnVzZWQpCgkJcmVmZXJlbmNlcwktLSBSQSdzIHJlZmVyZW5jZSBjb3VudGVyCgpmd3RfcmVzZXQKCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHJlc2V0IHRoZSBGV1QgdGFibGUsIGdldHRpbmcgcmlkIG9mIGFsbCB0aGUKCWVudHJpZXMuIFRoZXJlIGFyZSBubyBpbnB1dCBwYXJhbWV0ZXJzLgoKCQlpd3ByaXYgZXRoWCBmd3RfcmVzZXQKCglUaGUgY29tbWFuZCBkb2VzIG5vdCByZXR1cm4gYW55dGhpbmcuCgpmd3RfY2xlYW51cAoJVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gcGVyZm9ybSB1c2VyLWJhc2VkIGdhcmJhZ2UgcmVjb2xsZWN0aW9uLiBUaGUKCUZXVCB0YWJsZSBpcyBjaGVja2VkLCBhbmQgYWxsIHRoZSBlbnRyaWVzIHRoYXQgYXJlIGV4cGlyZWQgb3IgaW52YWxpZAoJYXJlIGNsZWFuZWQuIE5vdGUgdGhhdCB0aGlzIGlzIGV4cG9ydGVkIHRvIHRoZSBkcml2ZXIgZm9yIGRlYnVnZ2luZwoJcHVycG9zZXMsIGFzIGdhcmJhZ2UgY29sbGVjdGlvbiBpcyBhbHNvIGZpcmVkIGJ5IHRoZSBmaXJtd2FyZSB3aGVuIGluCglzcGFjZSBwcm9ibGVtcy4gVGhlcmUgYXJlIG5vIGlucHV0IHBhcmFtZXRlcnMuCgoJCWl3cHJpdiBldGhYIGZ3dF9jbGVhbnVwCgoJVGhlIGNvbW1hbmQgZG9lcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgaW52YWxpZC9leHBpcmVkIHJvdXRlcyBkZWxldGVkLgoKZnd0X3RpbWUKCVRoaXMgY29tbWFuZCByZXR1cm5zIGEgY2FyZCdzIGludGVybmFsIHRpbWUgcmVwcmVzZW50YXRpb24uICBJdCBpcyB0aGlzCgl0aW1lIHRoYXQgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGV4cGlyYXRpb24gdGltZXMgb2YgRldUIGVudHJpZXMuICBUaGUKCW51bWJlciBpcyBub3QgY29uc2lzdGVudCBmcm9tIGNhcmQgdG8gY2FyZDsgaXQgaXMgc2ltcGx5IGEgdGltZXIgY291bnQuCglUaGUgZnd0X3RpbWUgY29tbWFuZCBpcyB1c2VkIHRvIGluc3BlY3QgdGhlIHRpbWVyIHNvIHRoYXQgZXhwaXJhdGlvbgoJdGltZXMgcmVwb3J0ZWQgYnkgZnd0X2xpc3QgY2FuIGJlIHByb3Blcmx5IGludGVycHJldGVkLgoKCQlpd3ByaXYgZXRoWCBmd3RfdGltZQoKbWVzaF9nZXRfdHRsCgoJVGhlIG1lc2ggdHRsIGlzIHRoZSBudW1iZXIgb2YgaG9wcyBhIG1lc2ggcGFja2V0IGNhbiB0cmF2ZXJzZSBiZWZvcmUgaXQKCWlzIGRyb3BwZWQuICBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMgaW4gdGhlCgltZXNoIG5ldHdvcmsuICBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBpcyB0aGUgdHRsIGFzc2lnbmVkCgl0byBhbGwgbWVzaCBwYWNrZXRzLiAgQ3VycmVudGx5IHRoZXJlIGlzIG5vIHdheSB0byBjb250cm9sIHRoZSB0dGwgb24gYQoJcGVyIHBhY2tldCBvciBwZXIgc29ja2V0IGJhc2lzLgoKCWl3cHJpdiBldGhYIG1lc2hfZ2V0X3R0bAoKbWVzaF9zZXRfdHRsIHR0bAoKCVNldCB0aGUgdHRsLiAgVGhlIGFyZ3VtZW50IG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTUuCgoJaXdwcml2IGV0aFggbWVzaF9zZXRfdHRsIDx0dGw+Cgo9PT09PT09PT09PT09PT09PT09PT09PT09CkVUSFRPT0wKPT09PT09PT09PT09PT09PT09PT09PT09PQoKClVzZSB0aGUgLWkgb3B0aW9uIHRvIHJldHJpZXZlIHZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgZHJpdmVyLgoKIyBldGh0b29sIC1pIGV0aDAKZHJpdmVyOiBsaWJlcnRhcwp2ZXJzaW9uOiBDT01NLVVTQjgzODgtMzE4LnA0CmZpcm13YXJlLXZlcnNpb246IDUuMTEwLjcKYnVzLWluZm86CgpVc2UgdGhlIC1lIG9wdGlvbiB0byByZWFkIHRoZSBFRVBST00gY29udGVudHMgb2YgdGhlIGNhcmQuCgoJVXNhZ2U6CglldGh0b29sIC1lIGV0aFggW3JhdyBvbnxvZmZdIFtvZmZzZXQgTl0gW2xlbmd0aCBOXQoKICAgICAgIC1lICAgICByZXRyaWV2ZXMgYW5kIHByaW50cyBhbiBFRVBST00gZHVtcCBmb3IgdGhlICBzcGVjaWZpZWQgIGV0aGVybmV0CiAgICAgICAgICAgICAgZGV2aWNlLiAgIFdoZW4gcmF3IGlzIGVuYWJsZWQsIHRoZW4gaXQgZHVtcHMgdGhlIHJhdyBFRVBST00gZGF0YQogICAgICAgICAgICAgIHRvIHN0ZG91dC4gVGhlIGxlbmd0aCBhbmQgb2Zmc2V0IHBhcmFtZXRlcnMgYWxsb3cgIGR1bXBpbmcgIGNlci0KICAgICAgICAgICAgICB0YWluIHBvcnRpb25zIG9mIHRoZSBFRVBST00uICBEZWZhdWx0IGlzIHRvIGR1bXAgdGhlIGVudGlyZSBFRVAtCiAgICAgICAgICAgICAgUk9NLgoKIyBldGh0b29sIC1lIGV0aDAgb2Zmc2V0IDAgbGVuZ3RoIDE2Ck9mZnNldCAgICAgICAgICBWYWx1ZXMKLS0tLS0tICAgICAgICAgIC0tLS0tLQoweDAwMDAgICAgICAgICAgMzggMzMgMzAgNTggMDAgMDAgMzQgZjQgMDAgMDAgMTAgMDAgMDAgYzQgMTcgMDAKCj09PT09PT09PT09PT09PT09PT09PT09PQpERUJVR0ZTIENPTU1BTkRTCj09PT09PT09PT09PT09PT09PT09PT09PQoKdGhvc2UgY29tbWFuZHMgYXJlIHVzZWQgdmlhIGRlYnVnZnMgaW50ZXJmYWNlCgo9PT09PT09PT09PQpyZG1hYwpyZGJicApyZHJmCglUaGVzZSBjb21tYW5kcyBhcmUgdXNlZCB0byByZWFkIHRoZSBNQUMsIEJCUCBhbmQgUkYgcmVnaXN0ZXJzIGZyb20gdGhlCgljYXJkLiAgVGhlc2UgY29tbWFuZHMgdGFrZSBvbmUgcGFyYW1ldGVyIHRoYXQgc3BlY2lmaWVzIHRoZSBvZmZzZXQKCWxvY2F0aW9uIHRoYXQgaXMgdG8gYmUgcmVhZC4gIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgc3BlY2lmaWVkIGluCgloZXhhZGVjaW1hbCAoaXRzIHBvc3NpYmxlIHRvIHByZWNlZWQgcHJlY2VkaW5nIHRoZSBudW1iZXIgd2l0aCBhICIweCIpLgoKCVBhdGg6IC9kZWJ1Z2ZzL2xpYmVydGFzX3dpcmVsZXNzL2V0aFgvcmVnaXN0ZXJzLwoKCVVzYWdlOgoJCWVjaG8gIjB4YTEyMyIgPiByZG1hYyA7IGNhdCByZG1hYwoJCWVjaG8gIjB4YTEyMyIgPiByZGJicCA7IGNhdCByZGJicAoJCWVjaG8gIjB4YTEyMyIgPiByZHJmIDsgY2F0IHJkcmYKd3JtYWMKd3JiYnAKd3JyZgoJVGhlc2UgY29tbWFuZHMgYXJlIHVzZWQgdG8gd3JpdGUgdGhlIE1BQywgQkJQIGFuZCBSRiByZWdpc3RlcnMgaW4gdGhlCgljYXJkLiAgVGhlc2UgY29tbWFuZHMgdGFrZSB0d28gcGFyYW1ldGVycyB0aGF0IHNwZWNpZnkgdGhlIG9mZnNldAoJbG9jYXRpb24gYW5kIHRoZSB2YWx1ZSB0aGF0IGlzIHRvIGJlIHdyaXR0ZW4uIFRoaXMgcGFyYW1ldGVycyBtdXN0CgliZSBzcGVjaWZpZWQgaW4gaGV4YWRlY2ltYWwgKGl0cyBwb3NzaWJsZSB0byBwcmVjZWVkIHRoZSBudW1iZXIKCXdpdGggYSAiMHgiKS4KCglVc2FnZToKCQllY2hvICIweGExMjMgMHhhYSIgPiB3cm1hYwoJCWVjaG8gIjB4YTEyMyAweGFhIiA+IHdyYmJwCgkJZWNobyAiMHhhMTIzIDB4YWEiID4gd3JyZgoKc2xlZXBwYXJhbXMKCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldCB0aGUgc2xlZXBjbG9jayBjb25maWd1cmF0aW9ucwoKCVBhdGg6IC9kZWJ1Z2ZzL2xpYmVydGFzX3dpcmVsZXNzL2V0aFgvCgoJVXNhZ2U6CgkJY2F0IHNsZWVwcGFyYW1zOiByZWFkcyB0aGUgY3VycmVudCBzbGVlcGNsb2NrIGNvbmZpZ3VyYXRpb24KCgkJZWNobyAicDEgcDIgcDMgcDQgcDUgcDYiID4gc2xlZXBwYXJhbXM6IHdyaXRlcyB0aGUgc2xlZXBjbG9jayBjb25maWd1cmF0aW9uLgoKCQl3aGVyZToKCQkJcDEgaXMgU2xlZXAgY2xvY2sgZXJyb3IgaW4gcHBtICgwLTY1NTM1KQoJCQlwMiBpcyBXYWtldXAgb2Zmc2V0IGluIHVzZWMgKDAtNjU1MzUpCgkJCXAzIGlzIENsb2NrIHN0YWJpbGl6YXRpb24gdGltZSBpbiB1c2VjICgwLTY1NTM1KQoJCQlwNCBpcyBDb250cm9sIHBlcmlvZGljIGNhbGlicmF0aW9uICgwLTIpCgkJCXA1IGlzIENvbnRyb2wgdGhlIHVzZSBvZiBleHRlcm5hbCBzbGVlcCBjbG9jayAoMC0yKQoJCQlwNiBpcyByZXNlcnZlZCBmb3IgZGVidWcgKDAtNjU1MzUpCgpzdWJzY3JpYmVkX2V2ZW50cwoKCVRoZSBzdWJzY3JpYmVkX2V2ZW50cyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIGludGVyZmFjZSBmb3IgdGhlCglzdWJzY3JpYmVkIGV2ZW50cyBBUEkuCgoJUGF0aDogL2RlYnVnZnMvbGliZXJ0YXNfd2lyZWxlc3MvZXRoWC9zdWJzY3JpYmVkX2V2ZW50cy8KCglFYWNoIGV2ZW50IGlzIHJlcHJlc2VudGVkIGJ5IGEgZmlsZW5hbWUuIEVhY2ggZmlsZW5hbWUgY29uc2lzdHMgb2YgdGhlCglmb2xsb3dpbmcgdGhyZWUgZmllbGRzOgoJVmFsdWUgRnJlcXVlbmN5IFN1YnNjcmliZWQKCglUbyByZWFkIHRoZSBjdXJyZW50IHZhbHVlcyBmb3IgYSBnaXZlbiBldmVudCwgZG86CgkJY2F0IGV2ZW50CglUbyBzZXQgdGhlIGN1cnJlbnQgdmFsdWVzLCBkbzoKCQllY2hvICI2MCAyIDEiID4gZXZlbnQKCglGcmVxdWVuY3kgZmllbGQgc3BlY2lmaWVzIHRoZSByZXBvcnRpbmcgZnJlcXVlbmN5IGZvciB0aGlzIGV2ZW50LgoJSWYgaXQgaXMgc2V0IHRvIDAsIHRoZW4gdGhlIGV2ZW50IGlzIHJlcG9ydGVkIG9ubHkgb25jZSwgYW5kIHRoZW4KCWF1dG9tYXRpY2FsbHkgdW5zdWJzY3JpYmVkLiBJZiBpdCBpcyBzZXQgdG8gMSwgdGhlbiB0aGUgZXZlbnQgaXMKCXJlcG9ydGVkIGV2ZXJ5IHRpbWUgaXQgb2NjdXJzLiBJZiBpdCBpcyBzZXQgdG8gTiwgdGhlbiB0aGUgZXZlbnQgaXMKCXJlcG9ydGVkIGV2ZXJ5IE50aCB0aW1lIGl0IG9jY3Vycy4KCgliZWFjb25fbWlzc2VkCglWYWx1ZSBmaWVsZCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBtaXNzaW5nIGJlYWNvbnMgd2hpY2gKCXRyaWdnZXJzIHRoZSBMSU5LX0xPU1MgZXZlbnQuIFRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIG9ubHkgb25jZSBhZnRlcgoJd2hpY2ggdGhlIGZpcm13YXJlIHJlc2V0cyBpdHMgc3RhdGUuIEF0IGluaXRpYWxpemF0aW9uLCB0aGUgTElOS19MT1NTCglldmVudCBpcyBzdWJzY3JpYmVkIGJ5IGRlZmF1bHQuIFRoZSBkZWZhdWx0IHZhbHVlIG9mIE1pc3NlZEJlYWNvbnMgaXMKCTYwLgoKCWZhaWx1cmVfY291bnQKCVZhbHVlIGZpZWxkIHNwZWNpZmllcyB0aGUgY29uc2VjdXRpdmUgZmFpbHVyZSBjb3VudCB0aHJlc2hvbGQgd2hpY2gKCXRyaWdnZXJzIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBNQVhfRkFJTCBldmVudC4gT25jZSB0aGlzIGV2ZW50IGlzCglnZW5lcmF0ZWQsIHRoZSBjb25zZWN1dGl2ZSBmYWlsdXJlIGNvdW50IGlzIHJlc2V0IHRvIDAuCglBdCBpbml0aWFsaXphdGlvbiwgdGhlIE1BWF9GQUlMIGV2ZW50IGlzIE5PVCBzdWJzY3JpYmVkIGJ5CglkZWZhdWx0LgoKCWhpZ2hfcnNzaQoJVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgd2hlbiB0aGUgYXZlcmFnZSByZWNlaXZlZCBSU1NJIGluIGJlYWNvbnMgZ29lcwoJYWJvdmUgYSB0aHJlc2hvbGQsIHNwZWNpZmllZCBieSBWYWx1ZS4KCglsb3dfcnNzaQoJVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgd2hlbiB0aGUgYXZlcmFnZSByZWNlaXZlZCBSU1NJIGluIGJlYWNvbnMgZ29lcwoJYmVsb3cgYSB0aHJlc2hvbGQsIHNwZWNpZmllZCBieSBWYWx1ZS4KCgloaWdoX3NucgoJVGhpcyBldmVudCBpcyBnZW5lcmF0ZWQgd2hlbiB0aGUgYXZlcmFnZSByZWNlaXZlZCBTTlIgaW4gYmVhY29ucyBnb2VzCglhYm92ZSBhIHRocmVzaG9sZCwgc3BlY2lmaWVkIGJ5IFZhbHVlLgoKCWxvd19zbnIKCVRoaXMgZXZlbnQgaXMgZ2VuZXJhdGVkIHdoZW4gdGhlIGF2ZXJhZ2UgcmVjZWl2ZWQgU05SIGluIGJlYWNvbnMgZ29lcwoJYmVsb3cgYSB0aHJlc2hvbGQsIHNwZWNpZmllZCBieSBWYWx1ZS4KCmV4dHNjYW4KCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGRvIGEgc3BlY2lmaWMgc2Nhbi4KCglQYXRoOiAvZGVidWdmcy9saWJlcnRhc193aXJlbGVzcy9ldGhYLwoKCVVzYWdlOiBlY2hvICJTU0lEIiA+IGV4dHNjYW4KCglFeGFtcGxlOgoJCWVjaG8gIkxJTktTWVMtQVAiID4gZXh0c2NhbgoKCVRvIHNlZSB0aGUgcmVzdWx0cyBvZiB1c2UgZ2V0c2NhbnRhYmxlIGNvbW1hbmQuCgpnZXRzY2FudGFibGUKCglEaXNwbGF5IHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBkcml2ZXIgc2NhbiB0YWJsZSAoaWUuIGdldCB0aGUKCXNjYW4gcmVzdWx0cykuCgoJUGF0aDogL2RlYnVnZnMvbGliZXJ0YXNfd2lyZWxlc3MvZXRoWC8KCglVc2FnZToKCQljYXQgZ2V0c2NhbnRhYmxlCgpzZXR1c2Vyc2NhbgoJSW5pdGlhdGUgYSBjdXN0b21pemVkIHNjYW4gYW5kIHJldHJpZXZlIHRoZSByZXN1bHRzCgoKCVBhdGg6IC9kZWJ1Z2ZzL2xpYmVydGFzX3dpcmVsZXNzL2V0aFgvCgogICAgVXNhZ2U6CiAgICAgICBlY2hvICJbQVJHU10iID4gc2V0dXNlcnNjYW4KCiAgICAgICAgIHdoZXJlIFtBUkdTXToKCiAgICAgIGNoYW49W2NoYW4jXVtiYW5kXVttb2RlXSB3aGVyZSBiYW5kIGlzIFthLGIsZ10gYW5kIG1vZGUgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYW5rIGZvciBhY3RpdmUgb3IgJ3AnIGZvciBwYXNzaXZlCiAgICAgIGJzc2lkPXh4Onh4Onh4Onh4Onh4Onh4ICBzcGVjaWZ5IGEgQlNTSUQgZmlsdGVyIGZvciB0aGUgc2NhbgogICAgICBzc2lkPSJbU1NJRF0iICAgICAgICAgICAgc3BlY2lmeSBhIFNTSUQgZmlsdGVyIGZvciB0aGUgc2NhbgogICAgICBrZWVwPVswIG9yIDFdICAgICAgICAgICAga2VlcCB0aGUgcHJldmlvdXMgc2NhbiByZXN1bHRzICgxKSwgZGlzY2FyZCAoMCkKICAgICAgZHVyPVtzY2FuIHRpbWVdICAgICAgICAgIHRpbWUgdG8gc2NhbiBmb3IgZWFjaCBjaGFubmVsIGluIG1pbGxpc2Vjb25kcwogICAgICBwcm9iZXM9WyNdICAgICAgICAgICAgICAgbnVtYmVyIG9mIHByb2JlIHJlcXVlc3RzIHRvIHNlbmQgb24gZWFjaCBjaGFuCiAgICAgIHR5cGU9WzEsMiwzXSAgICAgICAgICAgICBCU1MgdHlwZTogMSAoSW5mcmEpLCAyKEFkaG9jKSwgMyhBbnkpCgogICAgQW55IGNvbWJpbmF0aW9uIG9mIHRoZSBhYm92ZSBhcmd1bWVudHMgY2FuIGJlIHN1cHBsaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCiAgICAgIElmIHRoZSBjaGFuIHRva2VuIGlzIGFic2VudCwgYSBmdWxsIGNoYW5uZWwgc2NhbiB3aWxsIGJlIGNvbXBsZXRlZCBieQogICAgICB0aGUgZHJpdmVyLiAgSWYgdGhlIGR1ciBvciBwcm9iZXMgdG9rZW5zIGFyZSBhYnNlbnQsIHRoZSBkcml2ZXIgZGVmYXVsdAogICAgICBzZXR0aW5nIHdpbGwgYmUgdXNlZC4gIFRoZSBic3NpZCBhbmQgc3NpZCBmaWVsZHMsIGlmIGJsYW5rLAogICAgICB3aWxsIHByb2R1Y2UgYW4gdW5maWx0ZXJlZCBzY2FuLiBUaGUgdHlwZSBmaWVsZCB3aWxsIGRlZmF1bHQgdG8gMyAoQW55KQogICAgICBhbmQgdGhlIGtlZXAgZmllbGQgd2lsbCBkZWZhdWx0IHRvIDAgKERpc2NhcmQpLgoKICAgIEV4YW1wbGVzOgogICAgMSkgUGVyZm9ybSBhbiBhY3RpdmUgc2NhbiBvbiBjaGFubmVscyAxLCA2LCBhbmQgMTEgaW4gdGhlICdnJyBiYW5kOgogICAgICAgICAgICBlY2hvICJjaGFuPTFnLDZnLDExZyIgPiBzZXR1c2Vyc2NhbgoKICAgIDIpIFBlcmZvcm0gYSBwYXNzaXZlIHNjYW4gb24gY2hhbm5lbCAxMSBmb3IgMjAgbXM6CiAgICAgICAgICAgIGVjaG8gImNoYW49MTFncCBkdXI9MjAiID4gc2V0dXNlcnNjYW4KCiAgICAzKSBQZXJmb3JtIGFuIGFjdGl2ZSBzY2FuIG9uIGNoYW5uZWxzIDEsIDYsIGFuZCAxMTsgYW5kIGEgcGFzc2l2ZSBzY2FuIG9uCiAgICAgICBjaGFubmVsIDM2IGluIHRoZSAnYScgYmFuZDoKCiAgICAgICAgICAgIGVjaG8gImNoYW49MWcsNmcsMTFnLDM2YXAiID4gc2V0dXNlcnNjYW4KCiAgICA0KSBQZXJmb3JtIGFuIGFjdGl2ZSBzY2FuIG9uIGNoYW5uZWwgNiBhbmQgMzYgZm9yIGEgc3BlY2lmaWMgU1NJRDoKICAgICAgICAgICAgZWNobyAiY2hhbj02ZywzNmEgc3NpZD0iVGVzdEFQIiIgPiBzZXR1c2Vyc2NhbgoKICAgIDUpIFNjYW4gYWxsIGF2YWlsYWJsZSBjaGFubmVscyAoQi9HLCBBIGJhbmRzKSBmb3IgYSBzcGVjaWZpYyBCU1NJRCwga2VlcAogICAgICAgdGhlIGN1cnJlbnQgc2NhbiB0YWJsZSBpbnRhY3QsIHVwZGF0ZSBleGlzdGluZyBvciBhcHBlbmQgbmV3IHNjYW4gZGF0YToKICAgICAgICAgICAgZWNobyAiYnNzaWQ9MDA6NTA6NDM6MjA6MTI6ODIga2VlcD0xIiA+IHNldHVzZXJzY2FuCgogICAgNikgU2NhbiBjaGFubmVsIDYsIGZvciBhbGwgaW5mcmFzdHJ1Y3R1cmUgbmV0d29ya3MsIHNlbmRpbmcgdHdvIHByb2JlCiAgICAgICByZXF1ZXN0cy4gIEtlZXAgdGhlIHByZXZpb3VzIHNjYW4gdGFibGUgaW50YWN0LiBVcGRhdGUgYW55IGR1cGxpY2F0ZQogICAgICAgQlNTSUQvU1NJRCBtYXRjaGVzIHdpdGggdGhlIG5ldyBzY2FuIGRhdGE6CiAgICAgICAgICAgIGVjaG8gImNoYW49NmcgdHlwZT0xIHByb2Jlcz0yIGtlZXA9MSIgPiBzZXR1c2Vyc2NhbgoKICAgIEFsbCBlbnRyaWVzIGluIHRoZSBzY2FuIHRhYmxlIChub3QganVzdCB0aGUgbmV3IHNjYW4gZGF0YSB3aGVuIGtlZXA9MSkKICAgIHdpbGwgYmUgZGlzcGxheWVkIHVwb24gY29tcGxldGlvbiBieSB1c2Ugb2YgdGhlIGdldHNjYW50YWJsZSBpb2N0bC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo=