LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBBQlNUUkFDVAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgQ09ORklHX1BBQ0tFVF9NTUFQIG9wdGlvbiBhdmFpbGFibGUgd2l0aCB0aGUgUEFDS0VUCnNvY2tldCBpbnRlcmZhY2Ugb24gMi40IGFuZCAyLjYga2VybmVscy4gVGhpcyB0eXBlIG9mIHNvY2tldHMgaXMgdXNlZCBmb3IgCmNhcHR1cmUgbmV0d29yayB0cmFmZmljIHdpdGggdXRpbGl0aWVzIGxpa2UgdGNwZHVtcCBvciBhbnkgb3RoZXIgdGhhdCB1c2VzIAp0aGUgbGlicGNhcCBsaWJyYXJ5LiAKCllvdSBjYW4gZmluZCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudCBhdAoKICAgIGh0dHA6Ly9wdXNhLnV2LmVzL351bGlzc2VzL3BhY2tldF9tbWFwLwoKUGxlYXNlIHNlbmQgbWUgeW91ciBjb21tZW50cyB0bwoKICAgIFVsaXNzZXMgQWxvbnNvIENhbWFy8yA8dWFjYUBpLmhhdGUuc3BhbS5hbHVtbmkudXYuZXM+CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgV2h5IHVzZSBQQUNLRVRfTU1BUAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSW4gTGludXggMi40LzIuNiBpZiBQQUNLRVRfTU1BUCBpcyBub3QgZW5hYmxlZCwgdGhlIGNhcHR1cmUgcHJvY2VzcyBpcyB2ZXJ5CmluZWZmaWNpZW50LiBJdCB1c2VzIHZlcnkgbGltaXRlZCBidWZmZXJzIGFuZCByZXF1aXJlcyBvbmUgc3lzdGVtIGNhbGwKdG8gY2FwdHVyZSBlYWNoIHBhY2tldCwgaXQgcmVxdWlyZXMgdHdvIGlmIHlvdSB3YW50IHRvIGdldCBwYWNrZXQncyAKdGltZXN0YW1wIChsaWtlIGxpYnBjYXAgYWx3YXlzIGRvZXMpLgoKSW4gdGhlIG90aGVyIGhhbmQgUEFDS0VUX01NQVAgaXMgdmVyeSBlZmZpY2llbnQuIFBBQ0tFVF9NTUFQIHByb3ZpZGVzIGEgc2l6ZSAKY29uZmlndXJhYmxlIGNpcmN1bGFyIGJ1ZmZlciBtYXBwZWQgaW4gdXNlciBzcGFjZS4gVGhpcyB3YXkgcmVhZGluZyBwYWNrZXRzIGp1c3QgCm5lZWRzIHRvIHdhaXQgZm9yIHRoZW0sIG1vc3Qgb2YgdGhlIHRpbWUgdGhlcmUgaXMgbm8gbmVlZCB0byBpc3N1ZSBhIHNpbmdsZSAKc3lzdGVtIGNhbGwuIEJ5IHVzaW5nIGEgc2hhcmVkIGJ1ZmZlciBiZXR3ZWVuIHRoZSBrZXJuZWwgYW5kIHRoZSB1c2VyIAphbHNvIGhhcyB0aGUgYmVuZWZpdCBvZiBtaW5pbWl6aW5nIHBhY2tldCBjb3BpZXMuCgpJdCdzIGZpbmUgdG8gdXNlIFBBQ0tFVF9NTUFQIHRvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBjYXB0dXJlIHByb2Nlc3MsIApidXQgaXQgaXNuJ3QgZXZlcnl0aGluZy4gQXQgbGVhc3QsIGlmIHlvdSBhcmUgY2FwdHVyaW5nIGF0IGhpZ2ggc3BlZWRzICh0aGlzIAppcyByZWxhdGl2ZSB0byB0aGUgY3B1IHNwZWVkKSwgeW91IHNob3VsZCBjaGVjayBpZiB0aGUgZGV2aWNlIGRyaXZlciBvZiB5b3VyIApuZXR3b3JrIGludGVyZmFjZSBjYXJkIHN1cHBvcnRzIHNvbWUgc29ydCBvZiBpbnRlcnJ1cHQgbG9hZCBtaXRpZ2F0aW9uIG9yIAooZXZlbiBiZXR0ZXIpIGlmIGl0IHN1cHBvcnRzIE5BUEksIGFsc28gbWFrZSBzdXJlIGl0IGlzIGVuYWJsZWQuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhvdyB0byB1c2UgQ09ORklHX1BBQ0tFVF9NTUFQCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGcm9tIHRoZSB1c2VyIHN0YW5kcG9pbnQsIHlvdSBzaG91bGQgdXNlIHRoZSBoaWdoZXIgbGV2ZWwgbGlicGNhcCBsaWJyYXJ5LCB3aWNoCmlzIGEgZGUgZmFjdG8gc3RhbmRhcmQsIHBvcnRhYmxlIGFjcm9zcyBuZWFybHkgYWxsIG9wZXJhdGluZyBzeXN0ZW1zCmluY2x1ZGluZyBXaW4zMi4gCgpTYWlkIHRoYXQsIGF0IHRpbWUgb2YgdGhpcyB3cml0aW5nLCBvZmZpY2lhbCBsaWJwY2FwIDAuOC4xIGlzIG91dCBhbmQgZG9lc24ndCBpbmNsdWRlCnN1cHBvcnQgZm9yIFBBQ0tFVF9NTUFQLCBhbmQgYWxzbyBwcm9iYWJseSB0aGUgbGlicGNhcCBpbmNsdWRlZCBpbiB5b3VyIGRpc3RyaWJ1dGlvbi4gCgpJJ20gYXdhcmUgb2YgdHdvIGltcGxlbWVudGF0aW9ucyBvZiBQQUNLRVRfTU1BUCBpbiBsaWJwY2FwOgoKICAgIGh0dHA6Ly9wdXNhLnV2LmVzL351bGlzc2VzL3BhY2tldF9tbWFwLyAgKGJ5IFNpbW9uIFBhdGFyaW4sIGJhc2VkIG9uIGxpYnBjYXAgMC42LjIpCiAgICBodHRwOi8vcHVibGljLmxhbmwuZ292L2Nwdy8gICAgICAgICAgICAgIChieSBQaGlsIFdvb2QsIGJhc2VkIG9uIGxhc3Rlc3QgbGlicGNhcCkKClRoZSByZXN0IG9mIHRoaXMgZG9jdW1lbnQgaXMgaW50ZW5kZWQgZm9yIHBlb3BsZSB3aG8gd2FudCB0byB1bmRlcnN0YW5kCnRoZSBsb3cgbGV2ZWwgZGV0YWlscyBvciB3YW50IHRvIGltcHJvdmUgbGlicGNhcCBieSBpbmNsdWRpbmcgUEFDS0VUX01NQVAKc3VwcG9ydC4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgSG93IHRvIHVzZSBDT05GSUdfUEFDS0VUX01NQVAgZGlyZWN0bHkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkZyb20gdGhlIHN5c3RlbSBjYWxscyBzdGFuZCBwb2ludCwgdGhlIHVzZSBvZiBQQUNLRVRfTU1BUCBpbnZvbHZlcwp0aGUgZm9sbG93aW5nIHByb2Nlc3M6CgoKW3NldHVwXSAgICAgc29ja2V0KCkgLS0tLS0tLT4gY3JlYXRpb24gb2YgdGhlIGNhcHR1cmUgc29ja2V0CiAgICAgICAgICAgIHNldHNvY2tvcHQoKSAtLS0+IGFsbG9jYXRpb24gb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlciAocmluZykKICAgICAgICAgICAgbW1hcCgpIC0tLS0tLS0tLT4gbWFwaW5nIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyIHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyIHByb2Nlc3MKCltjYXB0dXJlXSAgIHBvbGwoKSAtLS0tLS0tLS0+IHRvIHdhaXQgZm9yIGluY29taW5nIHBhY2tldHMKCltzaHV0ZG93bl0gIGNsb3NlKCkgLS0tLS0tLS0+IGRlc3RydWN0aW9uIG9mIHRoZSBjYXB0dXJlIHNvY2tldCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVhbGxvY2F0aW9uIG9mIGFsbCBhc3NvY2lhdGVkIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuCgoKc29ja2V0IGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiBpcyBzdHJhaWdodCBmb3J3YXJkLCBhbmQgaXMgZG9uZSAKdGhlIHNhbWUgd2F5IHdpdGggb3Igd2l0aG91dCBQQUNLRVRfTU1BUDoKCmludCBmZDsKCmZkPSBzb2NrZXQoUEZfUEFDS0VULCBtb2RlLCBodG9ucyhFVEhfUF9BTEwpKQoKd2hlcmUgbW9kZSBpcyBTT0NLX1JBVyBmb3IgdGhlIHJhdyBpbnRlcmZhY2Ugd2VyZSBsaW5rIGxldmVsCmluZm9ybWF0aW9uIGNhbiBiZSBjYXB0dXJlZCBvciBTT0NLX0RHUkFNIGZvciB0aGUgY29va2VkCmludGVyZmFjZSB3aGVyZSBsaW5rIGxldmVsIGluZm9ybWF0aW9uIGNhcHR1cmUgaXMgbm90IApzdXBwb3J0ZWQgYW5kIGEgbGluayBsZXZlbCBwc2V1ZG8taGVhZGVyIGlzIHByb3ZpZGVkIApieSB0aGUga2VybmVsLgoKVGhlIGRlc3RydWN0aW9uIG9mIHRoZSBzb2NrZXQgYW5kIGFsbCBhc3NvY2lhdGVkIHJlc291cmNlcwppcyBkb25lIGJ5IGEgc2ltcGxlIGNhbGwgdG8gY2xvc2UoZmQpLgoKTmV4dCBJIHdpbGwgZGVzY3JpYmUgUEFDS0VUX01NQVAgc2V0dGluZ3MgYW5kIGl0J3MgY29uc3RyYWludHMsCmFsc28gdGhlIG1hcGluZyBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyIGluIHRoZSB1c2VyIHByb2Nlc3MgYW5kIAp0aGUgdXNlIG9mIHRoaXMgYnVmZmVyLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBQQUNLRVRfTU1BUCBzZXR0aW5ncwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKClRvIHNldHVwIFBBQ0tFVF9NTUFQIGZyb20gdXNlciBsZXZlbCBjb2RlIGlzIGRvbmUgd2l0aCBhIGNhbGwgbGlrZQoKICAgICBzZXRzb2Nrb3B0KGZkLCBTT0xfUEFDS0VULCBQQUNLRVRfUlhfUklORywgKHZvaWQgKikgJnJlcSwgc2l6ZW9mKHJlcSkpCgpUaGUgbW9zdCBzaWduaWZpY2FudCBhcmd1bWVudCBpbiB0aGUgcHJldmlvdXMgY2FsbCBpcyB0aGUgcmVxIHBhcmFtZXRlciwgCnRoaXMgcGFyYW1ldGVyIG11c3QgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKCiAgICBzdHJ1Y3QgdHBhY2tldF9yZXEKICAgIHsKICAgICAgICB1bnNpZ25lZCBpbnQgICAgdHBfYmxvY2tfc2l6ZTsgIC8qIE1pbmltYWwgc2l6ZSBvZiBjb250aWd1b3VzIGJsb2NrICovCiAgICAgICAgdW5zaWduZWQgaW50ICAgIHRwX2Jsb2NrX25yOyAgICAvKiBOdW1iZXIgb2YgYmxvY2tzICovCiAgICAgICAgdW5zaWduZWQgaW50ICAgIHRwX2ZyYW1lX3NpemU7ICAvKiBTaXplIG9mIGZyYW1lICovCiAgICAgICAgdW5zaWduZWQgaW50ICAgIHRwX2ZyYW1lX25yOyAgICAvKiBUb3RhbCBudW1iZXIgb2YgZnJhbWVzICovCiAgICB9OwoKVGhpcyBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiAvdXNyL2luY2x1ZGUvbGludXgvaWZfcGFja2V0LmggYW5kIGVzdGFibGlzaGVzIGEgCmNpcmN1bGFyIGJ1ZmZlciAocmluZykgb2YgdW5zd2FwcGFibGUgbWVtb3J5IG1hcHBlZCBpbiB0aGUgY2FwdHVyZSBwcm9jZXNzLiAKQmVpbmcgbWFwcGVkIGluIHRoZSBjYXB0dXJlIHByb2Nlc3MgYWxsb3dzIHJlYWRpbmcgdGhlIGNhcHR1cmVkIGZyYW1lcyBhbmQgCnJlbGF0ZWQgbWV0YS1pbmZvcm1hdGlvbiBsaWtlIHRpbWVzdGFtcHMgd2l0aG91dCByZXF1aXJpbmcgYSBzeXN0ZW0gY2FsbC4KCkNhcHR1cmVkIGZyYW1lcyBhcmUgZ3JvdXBlZCBpbiBibG9ja3MuIEVhY2ggYmxvY2sgaXMgYSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgCnJlZ2lvbiBvZiBtZW1vcnkgYW5kIGhvbGRzIHRwX2Jsb2NrX3NpemUvdHBfZnJhbWVfc2l6ZSBmcmFtZXMuIFRoZSB0b3RhbCBudW1iZXIgCm9mIGJsb2NrcyBpcyB0cF9ibG9ja19uci4gTm90ZSB0aGF0IHRwX2ZyYW1lX25yIGlzIGEgcmVkdW5kYW50IHBhcmFtZXRlciBiZWNhdXNlCgogICAgZnJhbWVzX3Blcl9ibG9jayA9IHRwX2Jsb2NrX3NpemUvdHBfZnJhbWVfc2l6ZQoKaW5kZWVkLCBwYWNrZXRfc2V0X3JpbmcgY2hlY2tzIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb24gaXMgdHJ1ZQoKICAgIGZyYW1lc19wZXJfYmxvY2sgKiB0cF9ibG9ja19uciA9PSB0cF9mcmFtZV9ucgoKCkxldHMgc2VlIGFuIGV4YW1wbGUsIHdpdGggdGhlIGZvbGxvd2luZyB2YWx1ZXM6CgogICAgIHRwX2Jsb2NrX3NpemU9IDQwOTYKICAgICB0cF9mcmFtZV9zaXplPSAyMDQ4CiAgICAgdHBfYmxvY2tfbnIgID0gNAogICAgIHRwX2ZyYW1lX25yICA9IDgKCndlIHdpbGwgZ2V0IHRoZSBmb2xsb3dpbmcgYnVmZmVyIHN0cnVjdHVyZToKCiAgICAgICAgYmxvY2sgIzEgICAgICAgICAgICAgICAgIGJsb2NrICMyICAgICAgICAgCistLS0tLS0tLS0rLS0tLS0tLS0tKyAgICArLS0tLS0tLS0tKy0tLS0tLS0tLSsgICAgCnwgZnJhbWUgMSB8IGZyYW1lIDIgfCAgICB8IGZyYW1lIDMgfCBmcmFtZSA0IHwgICAgCistLS0tLS0tLS0rLS0tLS0tLS0tKyAgICArLS0tLS0tLS0tKy0tLS0tLS0tLSsgICAgCgogICAgICAgIGJsb2NrICMzICAgICAgICAgICAgICAgICBibG9jayAjNAorLS0tLS0tLS0tKy0tLS0tLS0tLSsgICAgKy0tLS0tLS0tLSstLS0tLS0tLS0rCnwgZnJhbWUgNSB8IGZyYW1lIDYgfCAgICB8IGZyYW1lIDcgfCBmcmFtZSA4IHwKKy0tLS0tLS0tLSstLS0tLS0tLS0rICAgICstLS0tLS0tLS0rLS0tLS0tLS0tKwoKQSBmcmFtZSBjYW4gYmUgb2YgYW55IHNpemUgd2l0aCB0aGUgb25seSBjb25kaXRpb24gaXQgY2FuIGZpdCBpbiBhIGJsb2NrLiBBIGJsb2NrCmNhbiBvbmx5IGhvbGQgYW4gaW50ZWdlciBudW1iZXIgb2YgZnJhbWVzLCBvciBpbiBvdGhlciB3b3JkcywgYSBmcmFtZSBjYW5ub3QgCmJlIHNwYXduIGFjY3Jvc3MgdHdvIGJsb2NrcyBzbyB0aGVyZSBhcmUgc29tZSBkYXRhaWxzIHlvdSBoYXZlIHRvIHRha2UgaW50byAKYWNjb3VudCB3aGVuIGNob29zaW5nIHRoZSBmcmFtZV9zaXplLiBTZWUgIk1hcGluZyBhbmQgdXNlIG9mIHRoZSBjaXJjdWxhciAKYnVmZmVyIChyaW5nKSIuCgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBQQUNLRVRfTU1BUCBzZXR0aW5nIGNvbnN0cmFpbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpJbiBrZXJuZWwgdmVyc2lvbnMgcHJpb3IgdG8gMi40LjI2IChmb3IgdGhlIDIuNCBicmFuY2gpIGFuZCAyLjYuNSAoMi42IGJyYW5jaCksCnRoZSBQQUNLRVRfTU1BUCBidWZmZXIgY291bGQgaG9sZCBvbmx5IDMyNzY4IGZyYW1lcyBpbiBhIDMyIGJpdCBhcmNoaXRlY3R1cmUgb3IKMTYzODQgaW4gYSA2NCBiaXQgYXJjaGl0ZWN0dXJlLiBGb3IgaW5mb3JtYXRpb24gb24gdGhlc2Uga2VybmVsIHZlcnNpb25zCnNlZSBodHRwOi8vcHVzYS51di5lcy9+dWxpc3Nlcy9wYWNrZXRfbW1hcC9wYWNrZXRfbW1hcC5wcmUtMi40LjI2XzIuNi41LnR4dAoKIEJsb2NrIHNpemUgbGltaXQKLS0tLS0tLS0tLS0tLS0tLS0tCgpBcyBzdGF0ZWQgZWFybGllciwgZWFjaCBibG9jayBpcyBhIGNvbnRpZ3VvdXMgcGh5c2ljYWwgcmVnaW9uIG9mIG1lbW9yeS4gVGhlc2UgCm1lbW9yeSByZWdpb25zIGFyZSBhbGxvY2F0ZWQgd2l0aCBjYWxscyB0byB0aGUgX19nZXRfZnJlZV9wYWdlcygpIGZ1bmN0aW9uLiBBcyAKdGhlIG5hbWUgaW5kaWNhdGVzLCB0aGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBwYWdlcyBvZiBtZW1vcnksIGFuZCB0aGUgc2Vjb25kCmFyZ3VtZW50IGlzICJvcmRlciIgb3IgYSBwb3dlciBvZiB0d28gbnVtYmVyIG9mIHBhZ2VzLCB0aGF0IGlzIAooZm9yIFBBR0VfU0laRSA9PSA0MDk2KSBvcmRlcj0wID09PiA0MDk2IGJ5dGVzLCBvcmRlcj0xID09PiA4MTkyIGJ5dGVzLCAKb3JkZXI9MiA9PT4gMTYzODQgYnl0ZXMsIGV0Yy4gVGhlIG1heGltdW0gc2l6ZSBvZiBhIApyZWdpb24gYWxsb2NhdGVkIGJ5IF9fZ2V0X2ZyZWVfcGFnZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgTUFYX09SREVSIG1hY3JvLiBNb3JlIApwcmVjaXNlbHkgdGhlIGxpbWl0IGNhbiBiZSBjYWxjdWxhdGVkIGFzOgoKICAgUEFHRV9TSVpFIDw8IE1BWF9PUkRFUgoKICAgSW4gYSBpMzg2IGFyY2hpdGVjdHVyZSBQQUdFX1NJWkUgaXMgNDA5NiBieXRlcyAKICAgSW4gYSAyLjQvaTM4NiBrZXJuZWwgTUFYX09SREVSIGlzIDEwCiAgIEluIGEgMi42L2kzODYga2VybmVsIE1BWF9PUkRFUiBpcyAxMQoKU28gZ2V0X2ZyZWVfcGFnZXMgY2FuIGFsbG9jYXRlIGFzIG11Y2ggYXMgNE1CIG9yIDhNQiBpbiBhIDIuNC8yLjYga2VybmVsIApyZXNwZWN0aXZlbHksIHdpdGggYW4gaTM4NiBhcmNoaXRlY3R1cmUuCgpVc2VyIHNwYWNlIHByb2dyYW1zIGNhbiBpbmNsdWRlIC91c3IvaW5jbHVkZS9zeXMvdXNlci5oIGFuZCAKL3Vzci9pbmNsdWRlL2xpbnV4L21tem9uZS5oIHRvIGdldCBQQUdFX1NJWkUgTUFYX09SREVSIGRlY2xhcmF0aW9ucy4KClRoZSBwYWdlc2l6ZSBjYW4gYWxzbyBiZSBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5IHdpdGggdGhlIGdldHBhZ2VzaXplICgyKSAKc3lzdGVtIGNhbGwuIAoKCiBCbG9jayBudW1iZXIgbGltaXQKLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRvIHVuZGVyc3RhbmQgdGhlIGNvbnN0cmFpbnRzIG9mIFBBQ0tFVF9NTUFQLCB3ZSBoYXZlIHRvIHNlZSB0aGUgc3RydWN0dXJlIAp1c2VkIHRvIGhvbGQgdGhlIHBvaW50ZXJzIHRvIGVhY2ggYmxvY2suCgpDdXJyZW50bHksIHRoaXMgc3RydWN0dXJlIGlzIGEgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHZlY3RvciB3aXRoIGttYWxsb2MgCmNhbGxlZCBwZ192ZWMsIGl0cyBzaXplIGxpbWl0cyB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IGNhbiBiZSBhbGxvY2F0ZWQuCgogICAgKy0tLSstLS0rLS0tKy0tLSsKICAgIHwgeCB8IHggfCB4IHwgeCB8CiAgICArLS0tKy0tLSstLS0rLS0tKwogICAgICB8ICAgfCAgIHwgICB8CiAgICAgIHwgICB8ICAgfCAgIHYKICAgICAgfCAgIHwgICB2ICBibG9jayAjNAogICAgICB8ICAgdiAgYmxvY2sgIzMKICAgICAgdiAgYmxvY2sgIzIKICAgICBibG9jayAjMQoKCmttYWxsb2MgYWxsb2NhdGVzIGFueSBudW1iZXIgb2YgYnl0ZXMgb2YgcGhpc2ljYWxseSBjb250aWd1b3VzIG1lbW9yeSBmcm9tIAphIHBvb2wgb2YgcHJlLWRldGVybWluZWQgc2l6ZXMuIFRoaXMgcG9vbCBvZiBtZW1vcnkgaXMgbWFudGFpbmVkIGJ5IHRoZSBzbGFiIAphbGxvY2F0b3Igd2ljaCBpcyBhdCB0aGUgZW5kIHRoZSByZXNwb25zaWJsZSBmb3IgZG9pbmcgdGhlIGFsbG9jYXRpb24gYW5kIApoZW5jZSB3aWNoIGltcG9zZXMgdGhlIG1heGltdW0gbWVtb3J5IHRoYXQga21hbGxvYyBjYW4gYWxsb2NhdGUuIAoKSW4gYSAyLjQvMi42IGtlcm5lbCBhbmQgdGhlIGkzODYgYXJjaGl0ZWN0dXJlLCB0aGUgbGltaXQgaXMgMTMxMDcyIGJ5dGVzLiBUaGUgCnByZWRldGVybWluZWQgc2l6ZXMgdGhhdCBrbWFsbG9jIHVzZXMgY2FuIGJlIGNoZWNrZWQgaW4gdGhlICJzaXplLTxieXRlcz4iIAplbnRyaWVzIG9mIC9wcm9jL3NsYWJpbmZvCgpJbiBhIDMyIGJpdCBhcmNoaXRlY3R1cmUsIHBvaW50ZXJzIGFyZSA0IGJ5dGVzIGxvbmcsIHNvIHRoZSB0b3RhbCBudW1iZXIgb2YgCnBvaW50ZXJzIHRvIGJsb2NrcyBpcwoKICAgICAxMzEwNzIvNCA9IDMyNzY4IGJsb2NrcwoKCiBQQUNLRVRfTU1BUCBidWZmZXIgc2l6ZSBjYWxjdWxhdG9yCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKRGVmaW5pdGlvbnM6Cgo8c2l6ZS1tYXg+ICAgIDogaXMgdGhlIG1heGltdW0gc2l6ZSBvZiBhbGxvY2FibGUgd2l0aCBrbWFsbG9jIChzZWUgL3Byb2Mvc2xhYmluZm8pCjxwb2ludGVyIHNpemU+OiBkZXBlbmRzIG9uIHRoZSBhcmNoaXRlY3R1cmUgLS0gc2l6ZW9mKHZvaWQgKikKPHBhZ2Ugc2l6ZT4gICA6IGRlcGVuZHMgb24gdGhlIGFyY2hpdGVjdHVyZSAtLSBQQUdFX1NJWkUgb3IgZ2V0cGFnZXNpemUgKDIpCjxtYXgtb3JkZXI+ICAgOiBpcyB0aGUgdmFsdWUgZGVmaW5lZCB3aXRoIE1BWF9PUkRFUgo8ZnJhbWUgc2l6ZT4gIDogaXQncyBhbiB1cHBlciBib3VuZCBvZiBmcmFtZSdzIGNhcHR1cmUgc2l6ZSAobW9yZSBvbiB0aGlzIGxhdGVyKQoKZnJvbSB0aGVzZSBkZWZpbml0aW9ucyB3ZSB3aWxsIGRlcml2ZSAKCgk8YmxvY2sgbnVtYmVyPiA9IDxzaXplLW1heD4vPHBvaW50ZXIgc2l6ZT4KCTxibG9jayBzaXplPiA9IDxwYWdlc2l6ZT4gPDwgPG1heC1vcmRlcj4KCnNvLCB0aGUgbWF4IGJ1ZmZlciBzaXplIGlzCgoJPGJsb2NrIG51bWJlcj4gKiA8YmxvY2sgc2l6ZT4KCmFuZCwgdGhlIG51bWJlciBvZiBmcmFtZXMgYmUKCgk8YmxvY2sgbnVtYmVyPiAqIDxibG9jayBzaXplPiAvIDxmcmFtZSBzaXplPgoKU3Vwb3NzZSB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMsIHdpY2ggYXBwbHkgZm9yIDIuNiBrZXJuZWwgYW5kIGFuCmkzODYgYXJjaGl0ZWN0dXJlOgoKCTxzaXplLW1heD4gPSAxMzEwNzIgYnl0ZXMKCTxwb2ludGVyIHNpemU+ID0gNCBieXRlcwoJPHBhZ2VzaXplPiA9IDQwOTYgYnl0ZXMKCTxtYXgtb3JkZXI+ID0gMTEKCmFuZCBhIHZhbHVlIGZvciA8ZnJhbWUgc2l6ZT4gb2YgMjA0OCBieXRlYXMuIFRoZXNlIHBhcmFtZXRlcnMgd2lsbCB5aWVsZAoKCTxibG9jayBudW1iZXI+ID0gMTMxMDcyLzQgPSAzMjc2OCBibG9ja3MKCTxibG9jayBzaXplPiA9IDQwOTYgPDwgMTEgPSA4IE1pQi4KCmFuZCBoZW5jZSB0aGUgYnVmZmVyIHdpbGwgaGF2ZSBhIDI2MjE0NCBNaUIgc2l6ZS4gU28gaXQgY2FuIGhvbGQgCjI2MjE0NCBNaUIgLyAyMDQ4IGJ5dGVzID0gMTM0MjE3NzI4IGZyYW1lcwoKCkFjdHVhbGx5LCB0aGlzIGJ1ZmZlciBzaXplIGlzIG5vdCBwb3NzaWJsZSB3aXRoIGFuIGkzODYgYXJjaGl0ZWN0dXJlLiAKUmVtZW1iZXIgdGhhdCB0aGUgbWVtb3J5IGlzIGFsbG9jYXRlZCBpbiBrZXJuZWwgc3BhY2UsIGluIHRoZSBjYXNlIG9mIAphbiBpMzg2IGtlcm5lbCdzIG1lbW9yeSBzaXplIGlzIGxpbWl0ZWQgdG8gMUdpQi4KCkFsbCBtZW1vcnkgYWxsb2NhdGlvbnMgYXJlIG5vdCBmcmVlZCB1bnRpbCB0aGUgc29ja2V0IGlzIGNsb3NlZC4gVGhlIG1lbW9yeSAKYWxsb2NhdGlvbnMgYXJlIGRvbmUgd2l0aCBHRlBfS0VSTkVMIHByaW9yaXR5LCB0aGlzIGJhc2ljYWxseSBtZWFucyB0aGF0IAp0aGUgYWxsb2NhdGlvbiBjYW4gd2FpdCBhbmQgc3dhcCBvdGhlciBwcm9jZXNzJyBtZW1vcnkgaW4gb3JkZXIgdG8gYWxsb2NhdGUgCnRoZSBuZWNlY2Vzc2FyeSBtZW1vcnksIHNvIG5vcm1hbGx5IGxpbWl0cyBjYW4gYmUgcmVhY2hlZC4KCiBPdGhlciBjb25zdHJhaW50cwotLS0tLS0tLS0tLS0tLS0tLS0tCgpJZiB5b3UgY2hlY2sgdGhlIHNvdXJjZSBjb2RlIHlvdSB3aWxsIHNlZSB0aGF0IHdoYXQgSSBkcmF3IGhlcmUgYXMgYSBmcmFtZQppcyBub3Qgb25seSB0aGUgbGluayBsZXZlbCBmcmFtZS4gQXQgdGhlIGJlZ2luaW5nIG9mIGVhY2ggZnJhbWUgdGhlcmUgaXMgYSAKaGVhZGVyIGNhbGxlZCBzdHJ1Y3QgdHBhY2tldF9oZHIgdXNlZCBpbiBQQUNLRVRfTU1BUCB0byBob2xkIGxpbmsgbGV2ZWwncyBmcmFtZQptZXRhIGluZm9ybWF0aW9uIGxpa2UgdGltZXN0YW1wLiBTbyB3aGF0IHdlIGRyYXcgaGVyZSBhIGZyYW1lIGl0J3MgcmVhbGx5IAp0aGUgZm9sbG93aW5nIChmcm9tIGluY2x1ZGUvbGludXgvaWZfcGFja2V0LmgpOgoKLyoKICAgRnJhbWUgc3RydWN0dXJlOgoKICAgLSBTdGFydC4gRnJhbWUgbXVzdCBiZSBhbGlnbmVkIHRvIFRQQUNLRVRfQUxJR05NRU5UPTE2CiAgIC0gc3RydWN0IHRwYWNrZXRfaGRyCiAgIC0gcGFkIHRvIFRQQUNLRVRfQUxJR05NRU5UPTE2CiAgIC0gc3RydWN0IHNvY2thZGRyX2xsCiAgIC0gR2FwLCBjaG9zZW4gc28gdGhhdCBwYWNrZXQgZGF0YSAoU3RhcnQrdHBfbmV0KSBhbGlnbmVzIHRvIAogICAgIFRQQUNLRVRfQUxJR05NRU5UPTE2CiAgIC0gU3RhcnQrdHBfbWFjOiBbIE9wdGlvbmFsIE1BQyBoZWFkZXIgXQogICAtIFN0YXJ0K3RwX25ldDogUGFja2V0IGRhdGEsIGFsaWduZWQgdG8gVFBBQ0tFVF9BTElHTk1FTlQ9MTYuCiAgIC0gUGFkIHRvIGFsaWduIHRvIFRQQUNLRVRfQUxJR05NRU5UPTE2CiAqLwogICAgICAgICAgIAogCiBUaGUgZm9sbG93aW5nIGFyZSBjb25kaXRpb25zIHRoYXQgYXJlIGNoZWNrZWQgaW4gcGFja2V0X3NldF9yaW5nCgogICB0cF9ibG9ja19zaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBQQUdFX1NJWkUgKDEpCiAgIHRwX2ZyYW1lX3NpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gVFBBQ0tFVF9IRFJMRU4gKG9idmlvdXMpCiAgIHRwX2ZyYW1lX3NpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIFRQQUNLRVRfQUxJR05NRU5UCiAgIHRwX2ZyYW1lX25yICAgbXVzdCBiZSBleGFjdGx5IGZyYW1lc19wZXJfYmxvY2sqdHBfYmxvY2tfbnIKCk5vdGUgdGhhdCB0cF9ibG9ja19zaXplIHNob3VsZCBiZSBjaG9vc2VkIHRvIGJlIGEgcG93ZXIgb2YgdHdvIG9yIHRoZXJlIHdpbGwKYmUgYSB3YXN0ZSBvZiBtZW1vcnkuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE1hcGluZyBhbmQgdXNlIG9mIHRoZSBjaXJjdWxhciBidWZmZXIgKHJpbmcpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGUgbWFwaW5nIG9mIHRoZSBidWZmZXIgaW4gdGhlIHVzZXIgcHJvY2VzcyBpcyBkb25lIHdpdGggdGhlIGNvbnZlbnRpb25hbCAKbW1hcCBmdW5jdGlvbi4gRXZlbiB0aGUgY2lyY3VsYXIgYnVmZmVyIGlzIGNvbXBvdW5kIG9mIHNldmVyYWwgcGh5c2ljYWxseQpkaXNjb250aWd1b3VzIGJsb2NrcyBvZiBtZW1vcnksIHRoZXkgYXJlIGNvbnRpZ3VvdXMgdG8gdGhlIHVzZXIgc3BhY2UsIGhlbmNlCmp1c3Qgb25lIGNhbGwgdG8gbW1hcCBpcyBuZWVkZWQ6CgogICAgbW1hcCgwLCBzaXplLCBQUk9UX1JFQUR8UFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmQsIDApOwoKSWYgdHBfZnJhbWVfc2l6ZSBpcyBhIGRpdmlzb3Igb2YgdHBfYmxvY2tfc2l6ZSBmcmFtZXMgd2lsbCBiZSAKY29udGlndW9zbHkgc3BhY2VkIGJ5IHRwX2ZyYW1lX3NpemUgYnl0ZXMuIElmIG5vdCwgZWFjaCAKdHBfYmxvY2tfc2l6ZS90cF9mcmFtZV9zaXplIGZyYW1lcyB0aGVyZSB3aWxsIGJlIGEgZ2FwIGJldHdlZW4gCnRoZSBmcmFtZXMuIFRoaXMgaXMgYmVjYXVzZSBhIGZyYW1lIGNhbm5vdCBiZSBzcGF3biBhY3Jvc3MgdHdvCmJsb2Nrcy4gCgpBdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggZnJhbWUgdGhlcmUgaXMgYW4gc3RhdHVzIGZpZWxkIChzZWUgCnN0cnVjdCB0cGFja2V0X2hkcikuIElmIHRoaXMgZmllbGQgaXMgMCBtZWFucyB0aGF0IHRoZSBmcmFtZSBpcyByZWFkeQp0byBiZSB1c2VkIGZvciB0aGUga2VybmVsLCBJZiBub3QsIHRoZXJlIGlzIGEgZnJhbWUgdGhlIHVzZXIgY2FuIHJlYWQgCmFuZCB0aGUgZm9sbG93aW5nIGZsYWdzIGFwcGx5OgoKICAgICBmcm9tIGluY2x1ZGUvbGludXgvaWZfcGFja2V0LmgKCiAgICAgI2RlZmluZSBUUF9TVEFUVVNfQ09QWSAgICAgICAgICAyIAogICAgICNkZWZpbmUgVFBfU1RBVFVTX0xPU0lORyAgICAgICAgNCAKICAgICAjZGVmaW5lIFRQX1NUQVRVU19DU1VNTk9UUkVBRFkgIDggCgoKVFBfU1RBVFVTX0NPUFkgICAgICAgIDogVGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBmcmFtZSAoYW5kIGFzc29jaWF0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSBpbmZvcm1hdGlvbikgaGFzIGJlZW4gdHJ1bmNhdGVkIGJlY2F1c2UgaXQncyAKICAgICAgICAgICAgICAgICAgICAgICAgbGFyZ2VyIHRoYW4gdHBfZnJhbWVfc2l6ZS4gVGhpcyBwYWNrZXQgY2FuIGJlIAogICAgICAgICAgICAgICAgICAgICAgICByZWFkIGVudGlyZWx5IHdpdGggcmVjdmZyb20oKS4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIEluIG9yZGVyIHRvIG1ha2UgdGhpcyB3b3JrIGl0IG11c3QgdG8gYmUKICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCBwcmV2aW91c2x5IHdpdGggc2V0c29ja29wdCgpIGFuZCAKICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFBBQ0tFVF9DT1BZX1RIUkVTSCBvcHRpb24uIAoKICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG51bWJlciBvZiBmcmFtZXMgdGhhbiBjYW4gYmUgYnVmZmVyZWQgdG8gCiAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJlYWQgd2l0aCByZWN2ZnJvbSBpcyBsaW1pdGVkIGxpa2UgYSBub3JtYWwgc29ja2V0LgogICAgICAgICAgICAgICAgICAgICAgICBTZWUgdGhlIFNPX1JDVkJVRiBvcHRpb24gaW4gdGhlIHNvY2tldCAoNykgbWFuIHBhZ2UuCgpUUF9TVEFUVVNfTE9TSU5HICAgICAgOiBpbmRpY2F0ZXMgdGhlcmUgd2VyZSBwYWNrZXQgZHJvcHMgZnJvbSBsYXN0IHRpbWUgCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpc3RpY3Mgd2hlcmUgY2hlY2tlZCB3aXRoIGdldHNvY2tvcHQoKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFBBQ0tFVF9TVEFUSVNUSUNTIG9wdGlvbi4KClRQX1NUQVRVU19DU1VNTk9UUkVBRFk6IGN1cnJlbnRseSBpdCdzIHVzZWQgZm9yIG91dGdvaW5nIElQIHBhY2tldHMgd2ljaCAKICAgICAgICAgICAgICAgICAgICAgICAgaXQncyBjaGVja3N1bSB3aWxsIGJlIGRvbmUgaW4gaGFyZHdhcmUuIFNvIHdoaWxlIAogICAgICAgICAgICAgICAgICAgICAgICByZWFkaW5nIHRoZSBwYWNrZXQgd2Ugc2hvdWxkIG5vdCB0cnkgdG8gY2hlY2sgdGhlIAogICAgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bS4gCgpmb3IgY29udmVuaWVuY2UgdGhlcmUgYXJlIGFsc28gdGhlIGZvbGxvd2luZyBkZWZpbmVzOgoKICAgICAjZGVmaW5lIFRQX1NUQVRVU19LRVJORUwgICAgICAgIDAKICAgICAjZGVmaW5lIFRQX1NUQVRVU19VU0VSICAgICAgICAgIDEKClRoZSBrZXJuZWwgaW5pdGlhbGl6ZXMgYWxsIGZyYW1lcyB0byBUUF9TVEFUVVNfS0VSTkVMLCB3aGVuIHRoZSBrZXJuZWwKcmVjZWl2ZXMgYSBwYWNrZXQgaXQgcHV0cyBpbiB0aGUgYnVmZmVyIGFuZCB1cGRhdGVzIHRoZSBzdGF0dXMgd2l0aAphdCBsZWFzdCB0aGUgVFBfU1RBVFVTX1VTRVIgZmxhZy4gVGhlbiB0aGUgdXNlciBjYW4gcmVhZCB0aGUgcGFja2V0LApvbmNlIHRoZSBwYWNrZXQgaXMgcmVhZCB0aGUgdXNlciBtdXN0IHplcm8gdGhlIHN0YXR1cyBmaWVsZCwgc28gdGhlIGtlcm5lbCAKY2FuIHVzZSBhZ2FpbiB0aGF0IGZyYW1lIGJ1ZmZlci4KClRoZSB1c2VyIGNhbiB1c2UgcG9sbCAoYW55IG90aGVyIHZhcmlhbnQgc2hvdWxkIGFwcGx5IHRvbykgdG8gY2hlY2sgaWYgbmV3CnBhY2tldHMgYXJlIGluIHRoZSByaW5nOgoKICAgIHN0cnVjdCBwb2xsZmQgcGZkOwoKICAgIHBmZC5mZCA9IGZkOwogICAgcGZkLnJldmVudHMgPSAwOwogICAgcGZkLmV2ZW50cyA9IFBPTExJTnxQT0xMUkROT1JNfFBPTExFUlI7CgogICAgaWYgKHN0YXR1cyA9PSBUUF9TVEFUVVNfS0VSTkVMKQogICAgICAgIHJldHZhbCA9IHBvbGwoJnBmZCwgMSwgdGltZW91dCk7CgpJdCBkb2Vzbid0IGluY3VyIGluIGEgcmFjZSBjb25kaXRpb24gdG8gZmlyc3QgY2hlY2sgdGhlIHN0YXR1cyB2YWx1ZSBhbmQgCnRoZW4gcG9sbCBmb3IgZnJhbWVzLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBUSEFOS1MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgCiAgIEplc3NlIEJyYW5kZWJ1cmcsIGZvciBmaXhpbmcgbXkgZ3JhbW1hdGhpY2FsL3NwZWxsaW5nIGVycm9ycwoK